0

1,2,4,8 などのシーケンスの N 個の要素を出力したいのですが、N 個の子プロセスと N-1 個のパイプでそれを実行しようとしています。したがって、プロセス "i" が "a[i]" を計算すると、その値がプロセス i+1 に渡されるため、プロセスは a[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 です。

4

1 に答える 1

2

最後の子プロセス ( )は、 の末尾を過ぎたものをi == N - 1読み取ります。同様にプロセス書き込み先も終わりを過ぎています。すべてのパイプ インデックスを -1 オフセットする必要があります。cev[N - 1][0]cevN - 2cev[N - 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));
于 2013-08-14T22:12:31.987 に答える