gpt4 book ai didi

c - 了解管道

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:03 24 4
gpt4 key购买 nike

我想打印某个序列的 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。

最佳答案

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

关于c - 了解管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18242731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com