简体   繁体   English

创建了两个子进程。 父进程应该一直执行到一个子进程终止。 我如何在 c 中编写这个程序?

[英]Two child process are created. The parent process should execute until one child process terminates. How do I write this program in c?

The two child processes perform sorting by different methods.两个子进程通过不同的方法进行排序。 I want the parent process to wait until at least one child process terminates.我希望父进程等到至少一个子进程终止。 This code is not giving me the required output.这段代码没有给我所需的 output。

#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() is executed by the parent and the first child created from pid1 = fork() , which is not something you desire from the question description. pid2 = fork()由父级执行,第一个子级由pid1 = fork()创建,这不是您希望从问题描述中得到的。

You might want to have something like this你可能想要这样的东西

#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));
            }
        }
    }
}

When you do fork() , you have a new child process starts running at the same point with the parent process.当您执行fork()时,您将有一个新的子进程与父进程在同一点开始运行。 So you should make sure that only parent process calls the second fork() .所以你应该确保只有父进程调用第二个fork()

Key: fork() will return 0 on child process.键: fork()将在子进程上返回 0。

Here is the way to do that:这是执行此操作的方法:

Code代码

#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;
}

Compile and Run编译并运行

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

In this case, when a child process terminates (at least one), the parent will stop to wait.在这种情况下,当一个子进程终止(至少一个)时,父进程将停止等待。 So you see "Selection sort finished" after the parent process terminates, because we simulate selection sort as 5 seconds work, and bubble sort as 3 seconds work.所以你会在父进程终止后看到“选择排序完成”,因为我们将选择排序模拟为 5 秒的工作,冒泡排序为 3 秒的工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM