2015-04-01 51 views
1

我有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);    
} 
+1

您应该使用线程,无论是POSIX线程或Windows自带的线程API。这样你就可以简单地分叉线程(创建后台子进程)并将所有内容保存在同一个可执行文件中。这比拥有多个程序简单得多。 – dmedine 2015-04-01 17:59:41

+0

我们被告知我们必须使用wait()函数 – user3373360 2015-04-01 18:04:54

+0

,您可以在任何分叉线程 – dmedine 2015-04-01 21:08:28

回答

0

你并不需要明确地使用fork(),检查系统()函数(http://linux.die.net/man/3/system),它给你很好又简单的另一个进程的返回码。

+0

我们被告知我们必须使用wait()函数,尽管 – user3373360 2015-04-01 18:04:44

+1

在这种情况下,@ alk的响应是正确的。 – Cristik 2015-04-01 18:20:24

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> 
+0

这是否得到退出编号或返回number?如果它得到出口号码,我应该将“prime.c”中的返回值更改为退出(0)而不是返回0等吗? – user3373360 2015-04-01 18:16:44

+0

@ user3373360:调用'exit(0)'某处相当于'return 0 'from main()'。 – alk 2015-04-01 18:18:08

+0

好吧,但现在我得到孩子的退出代码是255.我想得到1或0,所以我可以检测到数字是否为素数? – user3373360 2015-04-01 18:36:45