我想通过父进程传达子进程。我创建了5个孩子,每个人都发送消息“Hello”。但parrent只读了一条消息..我是初学者,我不知道我做错了什么...到目前为止我的代码:
int main(int argc, char** argv) {
int n, p1[2], p2[2];
n = 2*atoi(argv[1]);
if(pipe(p1)) ERR("pipe1");
if(pipe(p2)) ERR("pipe2");
create_children(n, p1, p2);
if(TEMP_FAILURE_RETRY(close(p1[1]))) ERR("close");
parent_work(p1);
if(TEMP_FAILURE_RETRY(close(p1[0]))) ERR("close");
return EXIT_SUCCESS;
}
void create_children(int number, int p1[2], int p2[2]) {
while (number-- > 0) {
switch (fork()) {
case 0:
if(TEMP_FAILURE_RETRY(close(p1[0]))) ERR("close");
if(TEMP_FAILURE_RETRY(close(p2[0]))) ERR("close");
child_work(p1[1], p2[1]);
if(TEMP_FAILURE_RETRY(close(p1[1]))) ERR("close");
if(TEMP_FAILURE_RETRY(close(p2[1]))) ERR("close");
exit(EXIT_SUCCESS);
case -1: ERR("Fork:");
}
}
}
void child_work(int fd, int fd1, char *name, int which) {
char buffer[PIPE_BUF];
size_t *len = (size_t*)buffer;
char mb[PIPE_BUF];
snprintf(mb,PIPE_BUF,"%d hello\n",getpid());
if (-1 == TEMP_FAILURE_RETRY (write (fd, mb, (strlen(mb)+1)))) /
ERR ("sending witaj");
else
printf("%s\n",mb);
}
void parent_work(int fd) {
char buffer[PIPE_BUF];
if(TEMP_FAILURE_RETRY(read(fd, buffer, PIPE_BUF))==PIPE_BUF)ERR("read:");
printf("Process send message: %s\n", buffer);
while(TEMP_FAILURE_RETRY(wait(NULL))>0);
}
当我创建5个孩子时,我只收到1条消息。
答案 0 :(得分:1)
这不起作用:
char mb[]=" ";
snprintf(mb,PIPE_BUF,"%d",getpid());
strcat(mb,"hello");
你写过mb
的末尾,它只有两个字符的空间,因为它是用空格后跟一个NUL字节初始化的。在C语言中,当您使用snprintf
和strcat
进行结束时,数组不会神奇地增长。
从技术上讲,你调用所谓的未定义的行为,这意味着任何事情都可能发生。
答案 1 :(得分:0)
子节点发送以空值终止的消息,因此如果父节点接收到一个read
中的所有消息,则父节点将仅打印第一条消息。
我建议你让孩子们发送换行终止的消息(将\n
附加到发送字符串,不要发送空终止符。)