c-一个孩子的阅读过程会阻碍其他孩子的阅读



从我下面分享的代码中可以看到,我正在尝试实现1个中央服务器和n子级。首先,我通过从服务器分叉来创建所有n子级。此外,在分叉之前,我使用Pipe创建双向管道。在派生并创建了n子代之后,我想从子代代码中读取字符。他们都发送字符"A",但我只能从一个孩子身上阅读。我使用民意调查来选择活跃的孩子,并尝试从他们身上读取数据。是什么原因导致程序在一个孩子身上被阻止?我将感谢任何帮助。

#define Pipe(fd) socketpair(AF_UNIX, SOCK_STREAM, PF_UNIX, fd)
int n = 5;    
struct pollfd pfd[n];
for (int i = 0; i < n; i++){
Pipe(fd[i]);
if (fork() == 0){
close(fd[i][0]);
dup2(fd[i][1], 0);
dup2(fd[i][1], 1);
close(fd[i][1]);
execl(code, arguments);
}
else {
close(fd[i][1]);
dup2(fd[i][0], 0);
dup2(fd[i][0], 1);
close(fd[i][0]);
}
struct pollfd s;
s.fd = fd[i][1];
s.events = POLLIN;
s.revents = 0;
pfd[i] = s;
}   
while(1){
poll(pfd, n, 2);
for (int i = 0; i < n; i++){
if (pfd[i].revents && POLLIN){
char data;
read(0, &data, 1);
if (data == 'A'){ 
.
.
.
}
}
} 
}

父级中只能有一个标准输入文件描述符和一个标准输出文件描述符。你的代码是这样的:

for (int i = 0; i < n; i++){
Pipe(fd[i]);
if (fork() == 0){
close(fd[i][0]);
dup2(fd[i][1], 0);
dup2(fd[i][1], 1);
close(fd[i][1]);
execv(code, arguments);
}
else {
close(fd[i][1]);
dup2(fd[i][0], 0);
dup2(fd[i][0], 1);
close(fd[i][0]);
}
…poll setup…
}

每次创建子项时,都会小心地在父项中切换标准输入和标准输出,使程序只与最后一个子项连接。

您不应该像在父级中那样使用dup2();您可能需要在数组中保持文件描述符的打开状态,以便使用它们分别与子级通信。

我还没有回顾为什么你在fd[i]之后使用下标[0][1],但感觉不对。

您应该在execv()调用之后至少放置一个exit(1);_exit(1);;我更希望看到打印到stderr的错误消息,报告execv()失败。您不需要检查返回值;如果execv()返回,则失败;如果成功,则不会返回。否则,如果execv()失败,可能会导致多个进程都认为自己是父进程。这导致了混乱。始终确保处理执行其他程序的失败!

最新更新