C 正在等待2个子进程

C 正在等待2个子进程,c,pipe,fork,ipc,C,Pipe,Fork,Ipc,我正试图编写一个C程序,其中主进程创建两个孩子:乒乓球和乒乓球。Ping打印“Ping”,后跟一个数字,Pong打印“Pong”,后跟一个数字,输出必须与图1中的示例运行相同: 以下是我试图做的: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> void main(){ //initializing pipes int td[2]

我正试图编写一个C程序,其中主进程创建两个孩子:乒乓球和乒乓球。Ping打印“Ping”,后跟一个数字,Pong打印“Pong”,后跟一个数字,输出必须与图1中的示例运行相同:

以下是我试图做的:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

void main(){

//initializing pipes
int td[2];
int td2[2];

pipe(td);
pipe(td2);

int pid=fork();
if(pid){ //in parent process

int pid2=fork();

if(pid2){// still in parent process



//1st time
int number1;
printf("Enter a number: ");
scanf("%d",&number1);

write(td[1],&number1,sizeof(number1));
printf("<>");

write(td2[1],&number1,sizeof(number1));
printf("--");


//2nd time
int number2;
printf("Enter a number: ");
scanf("%d",&number2);

write(td[1],&number2,sizeof(number2));
printf("<>");

write(td2[1],&number2,sizeof(number2));
printf("--");

}
else{// in pong process

int number;

read(td2[0],&number,sizeof(number));
printf("pong%d \n",number);

}


}

else{ //in ping process

int number;

read(td[0],&number,sizeof(number));
printf("ping%d \n",number);

}

}//main end
#包括
#包括
#包括
#包括
void main(){
//初始化管道
int-td[2];
int-td2[2];
管道(td);
管道(td2);
int-pid=fork();
如果(pid){//在父进程中
int-pid2=fork();
if(pid2){//仍在父进程中
//第一次
整数1;
printf(“输入一个数字:”);
scanf(“%d”和编号1);
写入(td[1],&number1,sizeof(number1));
printf(“”);
写入(td2[1],&number1,sizeof(number1));
printf(“—”);
//第二次
整数2;
printf(“输入一个数字:”);
scanf(“%d”和编号2);
写入(td[1],&number2,sizeof(number2));
printf(“”);
写入(td2[1],&number2,sizeof(number2));
printf(“—”);
}
else{//in-pong进程
整数;
读取(td2[0],&number,sizeof(number));
printf(“pong%d\n”,数字);
}
}
ping过程中的else{//
整数;
读取(td[0],&number,sizeof(number));
printf(“ping%d\n”,编号);
}
}//主端
说明:我在这里遇到的问题是,在ping之前打印pong,并且父进程不等待其子进程结束(一些输出在root/desktop等之后打印)

我解决的另一个问题是,我在父进程中使用了read方法,它修复了我的问题,因为我知道read迫使程序等待,直到有东西写入管道,但在本例中,我们在父进程中使用了“write”,因此父进程不在等待

我还尝试实现wait(NULL),但它似乎不起作用

如果您(您的导师)的建议过于复杂,我们将不胜感激

因此,您希望您的
main()
执行以下操作

int main(void) {
    int n;
    //set up pipes and forks
    printf("Enter a number"); scanf("%d", &n);
    // make child1 output " ping<n>\n"
    puts(" <>");
    // make child2 output " pong<n>\n"
    printf(" --\nEnter a second number"); scanf("%d", &n);
    // make child1 output " ping<n>\n"
    puts(" <>");
    // make child2 output " pong<n>\n"
    puts(" -- THE END --");
    // close pipes
    return 0;
}
现在…我们如何让一个孩子(孩子们正在等待他们的
read()
call)工作呢?好吧,简单!我们在管道末端写

scanf("%d", &n); // get value from user
write(pipes1[1], &n, sizeof n); // automatically unblock child1
write(pipes2[1], &n, sizeof n); // automatically unblock child2
对第二个用户输入重复这些语句

不要忘记关闭管道的写入端

close(pipes1[1]);
close(pipes2[1]);
这就是
main()
函数。那么子函数呢?
子函数(char*sign,int pipes[2])


要控制输出的顺序,您需要强制每个要输出到stdout的进程等待其正确的循环。最简单的方法通常是让进程等待一些输入,就像在某个其他进程的管道中一样。因此,您的意思是我必须创建第三个管道并将其添加到父进程中?但我不期望任何来自子进程的值,我只将值从父进程发送到子进程。我是否只将管道空发送到父进程?或者可能有更好的等待来解决此问题。我不确定。我甚至尝试实现等待,但对memy无效。尝试:@alidgehib:other“child blocks on read()“真的没什么好解释的。。。设置管道;叉子和“把孩子送走”;将数据发送到(仍被阻止)子项。。。子级只是等待数据被读取,然后打印数据并退出。
close(pipes1[1]);
close(pipes2[1]);
void child(char *sign, int pipes[2]) {
    close(pipes[1]); // close write end
    int i;
    for (;;) {
        if (read(pipes[0], &i, sizeof i)) {
            printf(" %s%d\n", sign, i); // print and go back to waiting at the read()
        } else {
            break; // exit the loop when read fails
        }
    }
    close(pipes[0]); // no more reading
    exit(EXIT_SUCCESS); // not going back to main()
}