了解管道

时间:2013-08-14 21:36:16

标签: c fork pipe

我想打印一些序列的N个元素,比如1,2,4,8 ......我正试图用N个子进程和N-1个管道来做。 因此,当进程“i”计算“a [i]”时,它将该值传递给处理i + 1,这样他就可以计算[i + 1]等等......

我写过:

int main(){
int a = 1;
int i,j;
int cev[N-1][2];


for(i=0; i<N-1; i++) pipe(cev[i]);

for(i=0; i<N; i++){
    if(fork() == 0){ // child
        if(i>0){
            read(cev[i][READ],&a,sizeof(int));
            a = f(a);  // calculate next element
         }                        
         printf("%d     ",a); fflush(stdout);                        
         if(i!=N-1) write(cev[i+1][WRITE],&a,sizeof(int));

        // closing copies of pipes          
        for(j=0; j<N-1; j++){
            close(cev[j][READ]);
            close(cev[j][WRITE]);                   
        }
        exit(0);        
    }   
}

对我来说似乎是正确的,但我得到的N = 5的序列是2 1 2 4 8. Somebody.help.me。

1 个答案:

答案 0 :(得分:2)

最后一个子进程(i == N - 1)读取cev[N - 1][0]的结尾cev。类似地,进程N - 2写入cev[N - 1][1],这也是过去的结束。您需要将所有管道索引偏移-1:

if(i>0) {
  read(cev[i-1][READ],&a,sizeof(int));
  a = f(a);  // calculate next element
}
printf("%d     ",a); fflush(stdout);                        
if(i!=N-1) write(cev[i][WRITE],&a,sizeof(int));