【发布时间】:2017-03-30 14:34:15
【问题描述】:
我正在尝试生成两个通过管道连接的子进程。
孩子 1 应该通过管道向孩子 2 发送一个数字,孩子 2 应该打印它。我设法做到了,但是当我尝试循环执行此操作时,孩子 1 每次在发送另一个号码之前等待 1 秒,它不会发送任何内容。
我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <windows.h>
int main(int argc, char *argv[]) {
int fd[2];
pipe(fd);
pid_t pid1 = fork();
if (pid1) {
pid_t pid2 = fork();
if (pid2) { //parent
// do stuff as parent
} else { //child 2
close(fd[1]);
char stringNumberReceived[10];
while (1) {
read(fd[0], stringNumberReceived, sizeof (stringNumberReceived));
printf("number received: %s\n", stringNumberReceived);
}
}
} else {//child 1
close(fd[0]);
int num;
char stringnumber [10];
while (1) {
num = rand();
snprintf(stringnumber, 10, "%d", num);
printf("attempting to sent: %s\n", stringnumber);
write(fd[1], stringnumber, strlen(stringnumber) + 1);
Sleep(1000);
}
}
}
【问题讨论】:
-
您可以从检查
write和read返回的内容开始。如果他们返回-1失败,您需要检查errno以查看问题所在(例如使用perror将其打印出来)。另外,如果readreturn0表示管道的另一端已关闭,请也检查一下。 -
您还应该为
pipe和fork调用添加错误检查。close函数可能也失败,但是在传递正确的描述符时发生这种情况的可能性很小,所以通常不检查那个是可以的。 -
好的,我试过了,还检查了管道和叉子调用是否成功,我稍微更改了代码。输出:尝试发送:148176593 收到号码:148176593 尝试发送:108537774 运行成功(总时间:1s)。问题是写入功能失败并且当我尝试第二次发送号码时不返回任何内容。如果我在没有 Sleep(1000) 的情况下执行此操作,则 write() 会设法发送一堆数字,但一旦读取第一个数字,程序就会停止。