我实验的时候写了个程序A,这个程序先关闭终端的ICANON模式 (为的是让终端不必等待回车,接受输入后马上传递数据给进程)
然后让这个进程调用read从终端读取数据
代码见下面
void Icanon(){
struct termios tc;
tcgetattr(STDIN_FILENO, &tc);
tc.c_lflag &= ~ICANON;
tcsetattr(STDOUT_FILENO, TCSANOW, &tc);
}
int main(){
Icanon();
char c;
while(read(STDIN_FILENO, &c, 1)){
printf(" %c", c,);
fflush(stdout);
}
puts("End");
return 0;
}
然后我写了另外一个程序B, 这个程序先fork(), 然后再调用程序A;
这样运行程序B后,后台应该有两个A程序在运行,根据上面程序A的代码,
每当我输入一个字符,后面应该跟着输出两个相同的字符才对,但是实际上只跟着输出了一个字符,
说明在后台运行的两个程序A中, 只有一个得到了数据, 请问一下这个是怎么回事啊?
一个终端一次只能向一个进程或线程发送数据么
-
- 帖子: 10
- 注册时间: 2014-03-01 21:51
- 系统: ubuntu 13.10
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- astolia
- 论坛版主
- 帖子: 6569
- 注册时间: 2008-09-18 13:11
Re: 一个终端一次只能向一个进程或线程发送数据么
你怎么会认为会把输入的东西复制一份发给两个接收端呢?
显然是两个接收端互相抢夺输入的字符,谁抢到归谁。
你用下面这个程序跑一下就知道了
显然是两个接收端互相抢夺输入的字符,谁抢到归谁。
你用下面这个程序跑一下就知道了
代码: 全选
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
void Icanon(){
struct termios tc;
tcgetattr(STDIN_FILENO, &tc);
tc.c_lflag &= ~ICANON;
tcsetattr(STDOUT_FILENO, TCSANOW, &tc);
}
int main(){
pid_t pid = fork();
Icanon();
char c;
while(read(STDIN_FILENO, &c, 1)) {
printf("\n%d %c\n", pid, c);
fflush(stdout);
}
puts("End");
return 0;
}