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

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

首先,这个

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

可以在文档中阅读详细信息。


此代码也不知何故:

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

您正在从子isPrime.exe调用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  #include  

你不需要显式地使用fork(),检查system()函数( http://linux.die.net/man/3/system ),它为你提供了很好的和简单的其他进程的返回代码。