我有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);
}
答案 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),这样可以让您轻松获得其他进程的返回代码。