我想與父進程溝通子進程。我創建了5個孩子,每個人都發送給管道消息「你好」。但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信息。
如果我這樣做: 'char mb [PIPE_BUF]; snprintf(mb,PIPE_BUF,「%d hello \ n」,getpid());' 它不會發送null? – Ann
這樣做,並使用發送長度'strlen(mb)'(而不是'strlen(mb)+ 1')。 –
我仍然沒有得到我想要的東西。父母像你說的一樣接收所有消息,但是我需要寫入「Process send message:%s \ n」,buffer);爲每個子進程分開:( – Ann