一个终端一次只能向一个进程或线程发送数据么

内核编译和嵌入式产品的设计与开发
回复
qw4990
帖子: 10
注册时间: 2014-03-01 21:51
系统: ubuntu 13.10

一个终端一次只能向一个进程或线程发送数据么

#1

帖子 qw4990 » 2014-05-04 0:51

我实验的时候写了个程序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中, 只有一个得到了数据, 请问一下这个是怎么回事啊?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 一个终端一次只能向一个进程或线程发送数据么

#2

帖子 eexpress » 2014-05-04 8:47

可以开无数个sock。
● 鸣学
头像
astolia
论坛版主
帖子: 6569
注册时间: 2008-09-18 13:11

Re: 一个终端一次只能向一个进程或线程发送数据么

#3

帖子 astolia » 2014-05-05 16:54

你怎么会认为会把输入的东西复制一份发给两个接收端呢?
显然是两个接收端互相抢夺输入的字符,谁抢到归谁。

你用下面这个程序跑一下就知道了

代码: 全选

#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;
}
回复