【问题标题】:Two child process are created. The parent process should execute until one child process terminates. How do I write this program in c?创建了两个子进程。父进程应该一直执行到一个子进程终止。我如何用c编写这个程序?
【发布时间】:2021-08-20 04:48:06
【问题描述】:

两个子进程通过不同的方法进行排序。我希望父进程等到至少一个子进程终止。这段代码没有给我所需的输出。

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

【问题讨论】:

    标签: c linux fork wait exit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当您执行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 秒工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 2014-05-11
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        相关资源
        最近更新 更多