使用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 ),它为你提供了很好的和简单的其他进程的返回代码。