C 正在等待2个子进程
我正试图编写一个C程序,其中主进程创建两个孩子:乒乓球和乒乓球。Ping打印“Ping”,后跟一个数字,Pong打印“Pong”,后跟一个数字,输出必须与图1中的示例运行相同: 以下是我试图做的: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]
#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()
}