C语言中使用switch语句实现分叉过程的程序设计
我试图从父进程分叉2个进程,如下所示,但有时会出现错误(程序未完成),我不知道原因:C语言中使用switch语句实现分叉过程的程序设计,c,switch-statement,fork,C,Switch Statement,Fork,我试图从父进程分叉2个进程,如下所示,但有时会出现错误(程序未完成),我不知道原因: pid_t pidA, pidB; pidA = fork(); switch (pidA) { case -1: // error handling return -1; case 0: // first child code break; default: { // parent code 1
pid_t pidA, pidB;
pidA = fork();
switch (pidA) {
case -1:
// error handling
return -1;
case 0:
// first child code
break;
default: {
// parent code 1
pidB = fork();
switch(pidB) {
case -1:
// error handling
return -1;
case 0:
// second child code
break;
default:
// parent code 2, I think it's the same like parent code 1. Am I right?
waitpid(-1, NULL, 0);
printf("parent\n");
break;
}
// parent code 3, again same like parent code 1 and 2 ???
// when I use printf("Parent\n"); here it prints Parent 2 times and I don't know why.
}
}
有人能帮我找到这里的问题吗。
有什么解释就好了。
谢谢你你到底想在这里做什么? 当您第一次使用fork时,您的第一个子进程实际上什么都不做。 父级将继续并再次返回
pidB
,然后继续执行,直到执行waitpid()
函数为止
我假设您正在尝试等待新的子代码执行,然后在父代码继续打印“parent”之前终止
您正在等待-1的PID,它可能应该是pidB
如果将printf()
放在开关块外,则子项将在输出时打印“父项”,与生成它的父项相同。如果希望子级立即终止,可能需要return语句而不是break语句
按原样运行代码,在第二个开关
语句之外使用printf
语句,这是我的输出,使用pidB
显示正在打印的进程:
parent
Parent: pid=25046
Parent: pid=0
结果表明,这个孩子也是印刷者之一
如果在内部开关盒0中添加一个返回而不是中断,则会得到以下结果:
parent
Parent: pid=25095
以下是我的建议
// parent code 1
pidB = fork();
switch(pidB) {
case -1:
// error handling
return -1;
case 0:
// second child code
break;
default:
// parent code 2, I think it's the same like parent code 1. Am I right?
waitpid(pidB, NULL, 0); // wait for the child process to finish by using the PID of the child as the argument to waitpid
printf("parent\n");
break;
}
// the child will execute anything here unless you return or otherwise prevent the child process from getting here.
考虑流程树:
P
/ \
P C1
/ \
P C2
第一个分叉:拆分为p和C1
第二个fork:拆分为p和C2
C1
返回,不打印任何内容
C2
从开关断开,打印父项(注意大写字母p)并返回
p打印parent
和parent
这就解释了为什么它会打印两次Parent
对于未完成的程序,请检查的返回值并尝试进行相应的调试。我正在尝试从父进程分叉两个进程。然后每个进程将运行自己的代码,这只是示例示例。我希望家长等待他的孩子,然后运行自己的代码。我已经更新了我的答案,以反映您应该如何处理孩子和家长。记住,当您使用fork()时,每个进程都会自己并行执行。如果有特定的代码段您不想执行,那么您需要确保它位于“父级”永远无法到达的区域,反之亦然。确保使用waitpid()的返回值来了解发生了什么;只等待第二个孩子,第一个孩子呢?我想等待父级创建的每个进程,然后运行父级代码。我把break改为return,但它并没有帮助50次程序完成正确的51次失败。也许如果我使用if语句会更好…放一个waitpid(pidA,NULL,0)代码>就在第二个叉子之前,或者任何你想让它等待的地方。你有两个孩子;你等待其中一个完成,而不是另一个。我不相信使用开关
。我想它是可以工作的,但它看起来像意大利面,在某种程度上,使用if/then/else
正确构建的代码不起作用……尽管我显然有偏见)。