我有2个文件“prime.c”和“singlePrime.c”和singlePrime.c里面我正在尝试创建一个可以将自身变成“isPrime.exe”的子文件,它是由“prime.c ”。我想要做的是从isPrime.exe中获得返回数,因此根据输入数是否为素数,可以是1或0,然后将其存储在“singlePrime.c”的main()函数内的childNum中,以便我可以根据从“isPrime.exe”返回的1或0打印到终端是否为素数。下面是我的2个文件:使用wait()从子进程获取返回码?
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);
}
您应该使用线程,无论是POSIX线程或Windows自带的线程API。这样你就可以简单地分叉线程(创建后台子进程)并将所有内容保存在同一个可执行文件中。这比拥有多个程序简单得多。 – dmedine 2015-04-01 17:59:41
我们被告知我们必须使用wait()函数 – user3373360 2015-04-01 18:04:54
,您可以在任何分叉线程 – dmedine 2015-04-01 21:08:28