使用wait()从子进程中检索返回码?

时间:2015-04-01 17:48:36

标签: c fork parent-child

我有2个文件“prime.c”和“singlePrime.c”并且在singlePrime.c中。我正在尝试创建一个将自身变形为“isPrime.exe”的子项,这是一个由“prime”构成的可执行文件。 C”。我想要做的是从isPrime.exe获取返回数字,因此取决于输入的数字是否为素数,然后将其存储在“singlePrime.c”的main()函数内的childNum中,以便将其存储为1或0,以便我可以根据“isPrime.exe”返回的1或0打印到终端是否为素数。以下是我的2个文件:

prime.c:

/*
File is isPrime.c

Purpose:
a program that checks if a given number is a prime number

input:
number - a positive int  entered via the command line parameters.  For example isPrime 1234

output:
0 - if the input number is not a prime number
1 - if the input number is a prime number
2 - if the command line parameter is not correct

Assumption:
the program does not check if the number is a positive integer

*/


#include "stdio.h"
#include "stdlib.h"
#include <unistd.h>
#include "prime.h"

int main(int argc, char *argv[])
{
        int i;

        int number;

        if (argc < 2) {
            printf("Returning 2");
            return(2);
        }
        else number = atoi(argv[1]);
        if (isPrime(number)) {
                exit(1);
        }
        exit(0);
}


/*
Purpose: check if the input number is a prime number
input:
number - the number to be checked

return:
0 - if the number is not a prime number
1 - if the number is a prime number
*/
int isPrime(int number)
{
        int i;
        for(i = 2; i*i < number; i++) {
                usleep(100);
                if (number % i == 0) {
                        printf("%d is not a prime number!",number);
                        return(0);
                }
        }
        printf("%d is a prime number!",number);
        return(1);
}

singlePrime.c:

#include "stdio.h"
#include "stdlib.h"
#include <unistd.h>
#include "prime.h"

int main(int argc, char *argv[])
{
        int number, childNum;

        if (!atoi(argv[1])) {
                printf("Please use a valid integer as an argument!");
                exit(1);
        }

        int pid = fork();

        if (pid == 0) {
                wait(childNum);
                morph(argv[1]);
        }

        else {
                if (childNum == 0) {
                        printf("The input number is not a prime number!");
                        exit(1);
                }
                else if (childNum == 1) {
                        printf("The input number is a prime number!");
                        exit(1);
                }
                else if (childNum == 2) {
                        printf("Please input a number greater than 2!");
                        exit(1);
                }
        }
}

void morph(char *number)
{
        char *primeArgv[] = {
                "isPrime.exe",
                number,
                NULL,
        };

        execvp("isPrime.exe",primeArgv);               
}

2 个答案:

答案 0 :(得分:2)

首先,这个

wait(childNum);

应该让编译器发出一个明确的警告,你可以从中得出错误的信息。

确实你错误地使用了wait()。它需要一个指针:

wait(int * status);

以下列方式使用它:

  {
    int status;
    int result;

    do
    {
      result = 0;
      if ((pid_t) -1) == wait(&status)))
      {
        result = -1;
        if (errno == EINTR)
        {
          continue;
        }
        else
        {
          perror("wait() failed");
        }
      }

      break;
    } while (1);

    if (-1 != result)
    {
      if (WIFEXITED(status))
      {
        int ec = WEXITSTATUS(status);
        printf("The child's exit code is %d\n", ec);
      }
      else
      {
        printf("The child did not provide an exit code. It probably crashed?\n");
      }
    }
  }

详细信息可以在the documentation中阅读。


此代码也不合理:

        if (pid == 0) {
            wait(childNum);
            morph(argv[1]);
        }

您从孩子那里打电话给wait(),并且只有在您回复exec* isPrime.exe后才会这样做。

你可能想这样做

      pid = fork();
      if (-1 == pid)
      {
         perror("fork() failed");
      }
      else if (pid == 0) 
      {
        morph(argv[1]);
      }
      else
      {
        /* wait code as shown above goes here.
           childNum needs to get assigend. */
        if (childNum == 0) {
        ....
      }

此外,^ 2代码不会测试对execvp()的调用是否成功。

在它之后放一个perror("execvp() failed");


另外^ 3这个

#include "stdio.h"
#include "stdlib.h"

应该是

#include <stdio.h>
#include <stdlib.h>

答案 1 :(得分:0)

您不需要显式使用fork(),请检查system()函数(http://linux.die.net/man/3/system),这样可以让您轻松获得其他进程的返回代码。