這個問題是this question的擴展,修改了要求。請參考以前版本的鏈接。從最後一個問題的主要區別在於:c編程 - 父母雙方和4個孩子之間雙向溝通沒有結果
- 需要通過io重定向
我有兩個管道的每個子進程,並有孩子家長的溝通每個孩子
- 家長分發卡和存儲結果在陣列
- 寫入陣列管負責寫結束對每個子進程
- 每個進程需要讀取從管道的負責讀端陣列
- 產生相同的輸出與以前版本
問題是,當我運行的代碼,它沒有結果。我的代碼有什麼問題?
我打算爲每個孩子在2d數組中存儲所有管道,即read_pipe[s][x]
,其中s是子進程標識符,x是文件描述符。
我也研究過this question,但是,這個問題是針對1個家長的1個孩子,因爲我有4個孩子,所以無法解決我的問題。
爲更新版本的初始嘗試:
#include <stdio.h>
#include <string.h>
#define BUFFERSIZE 51
int main(void)
{
int ch;
ssize_t rread;
char *line = NULL;
size_t len = 0;
while (rread = getdelim(&line, &len, '\0', stdin) != -1) {
printf("Retrieved line of length %zu :\n", rread);
printf("%s", line);
}
char *array[BUFFERSIZE];
int i=0;
array[i] = strtok(line," ");
while(array[i]!=NULL)
{
array[++i] = strtok(NULL," ");
}
//for (i=0; i<=BUFFERSIZE; i++)
// printf("\narray: %s: %d", array[i], i);
//return 0;
int childlimit = 4;
int childpids[childlimit];
int currpid, s;
char *buf[BUFFERSIZE];
/** Pipe for reading for subprocess */
int read_pipe[4][2];
/** Pipe for writing to subprocess */
int write_pipe[4][2];
int n;
char buffer[100];
memset(buffer, '\0', 100);
if (pipe(read_pipe) == 0 && pipe(write_pipe) == 0)
{
for(s=0; s<childlimit; s++){
switch(currpid = fork()){
case 0:
printf("Child : %d, pid %d : ", s, getpid());
close(read_pipe[s][1]);
close(write_pipe[s][0]);
close(write_pipe[s][1]);
while((n = read(read_pipe[s][0], buf, BUFFERSIZE))>0){
printf("<child> %s", buf[n]); //no output
}
close(read_pipe[s][0]);
return 0;
case -1:
printf("Error when forking\n");
break;
default:
// in the father
childpids[s] = currpid;
// store current child pid
close(read_pipe[s][0]);
close(read_pipe[s][1]);
close(write_pipe[s][1]);
int j,tt;
for(j=0; j<BUFFERSIZE; j+=4){
buf[tt] = array[j];
tt++;
}
write(write_pipe[s][0],buf,BUFFERSIZE);
close(write_pipe[s][0]);
break;
}
}
//wait for all child created to die
waitpid(-1, NULL, 0);
printf("Father : %d childs created\n", s);
}
}
當你聲明int read_pipe [4] [2]時,你認爲'pipe(read_pipe)'會做什麼;'當期望接收'int fildes [2]'?恕我直言,只有第一個管道將被初始化。 –
加上即使管道設置正確,代碼也不會將任何東西從父級傳遞到'read_pipe',而是將其放在'write_pipe'中,子級完全關閉。 –
感謝您的意見。 @克里斯,請提供一個如何解決問題的答案。 –