如何解决创建了两个子进程父进程应该一直执行,直到一个子进程终止我如何用c编写这个程序?
两个子进程通过不同的方法进行排序。我希望父进程等到至少一个子进程终止。这段代码没有给我所需的输出。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
pid_t pid1,pid2;
int status;
pid1 = fork();
pid2 = fork();
if(pid1==0 && pid2 !=0)
{
//first child performing selection sort
exit(0);
}
if(pid1>0 && pid2 > 0)
{
wait(&status);
if(WIFEXITED(status))
{
printf("Parent process executed %d\n",WEXITSTATUS(status));
}
}
if(pid1>0 && pid2 ==0)
{
//second child performing bubble sort
exit(0);
}
}
解决方法
pid2 = fork()
由父项和从 pid1 = fork()
创建的第一个子项执行,这不是您希望从问题描述中得到的。
你可能想要这样的东西
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
pid_t pid1,pid2;
int status;
pid1 = fork();
if(pid1 == 0) {
//first child performing selection sort
exit(0);
}
if(pid1 > 0) {
pid2 = fork();
if(pid2 == 0) {
//second child performing bubble sort
exit(0);
}
if(pid2 > 0) {
wait(&status);
if(WIFEXITED(status)) {
printf("Parent process executed %d\n",WEXITSTATUS(status));
}
}
}
}
,
当您执行 fork()
时,您有一个新的子进程与父进程在同一点开始运行。所以你应该确保只有父进程调用第二个 fork()
。
键:fork()
将在子进程上返回 0。
方法如下:
代码
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
int status;
pid_t ret,pid1,pid2;
pid1 = fork();
if (pid1 == 0) {
// First child performing selection sort
printf("Do selection sort here...\n");
sleep(5);
printf("Selection sort finished\n");
exit(0);
}
pid2 = fork();
if (pid2 == 0) {
// Second child performing bubble sort
printf("Do bubble sort here...\n");
sleep(2);
printf("Bubble sort finished\n");
// The parent must get exit code 100 from this
exit(100);
}
// Parent process waits until at least one child process terminates
do {
status = 0;
ret = wait(&status);
if (WIFEXITED(status)) {
printf("Child process %d has exited with exit code: %d\n",ret,WEXITSTATUS(status));
break;
}
if (ret < 0) {
printf("wait() error: %s\n",strerror(errno));
break;
}
/* If we reach here,child may be traced or continued. */
} while (1);
printf("Parent has finished its waiting state...\n");
return 0;
}
编译运行
ammarfaizi2@integral:/tmp$ gcc -Wall -Wextra test.c -o test
ammarfaizi2@integral:/tmp$ ./test
Do bubble sort here...
Do selection sort here...
Bubble sort finished
Child process 143748 has exited with exit code: 100
Parent has finished its waiting state...
ammarfaizi2@integral:/tmp$ Selection sort finished
在这种情况下,当一个子进程(至少一个)终止时,父进程会停下来等待。所以你会在父进程终止后看到“选择排序完成”,因为我们模拟选择排序为 5 秒工作,冒泡排序为 3 秒工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。