【问题标题】:Understanding pipes了解管道
【发布时间】:2013-08-14 21:36:15
【问题描述】:

我想打印某个序列的 N 个元素,例如 1,2,4,8...,我正在尝试使用 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。Somebody.help.me。

【问题讨论】:

    标签: c fork pipe


    【解决方案1】:

    最后一个子进程 (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));
    

    【讨论】:

    • 哦,是的...我昨晚一定很累...非常感谢;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2016-09-02
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多