由于我无法弄清楚的一些原因,我的Mac上没有运行。我得到的输出只来自main.c 输出是
Parent PID 4066
Child PID 4067
Process 4067 exited with status 5
我需要main.c来执行counter.c并传递参数5,然后我必须在for循环中使用它,但无论我放在什么路径,我都无法让exec运行
// main.c中
int main(int argc, char *argv[]) {
pid_t childOrZero = fork();
if (childOrZero < 0){
perror("Error happened while trying to fork\n");
exit(-1);
}
if (childOrZero == 0){
printf("Child PID %d\n", (int)getpid());
execl("./counter", "5", NULL);
exit(5);
}
// THis must be parent
printf("Parent PID %d\n", (int)getpid());
int status = 0;
pid_t childpid = wait(&status);
int childReturnedValue = WEXITSTATUS(status);
printf("Process %d exited with status %d\n", (int)childOrZero, childReturnedValue);
return 0;
}
counter.c中
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main (int argc, char *argv[]){
for (int i = 0; i<5; i++){
printf("Process: %d %d\n", (int)getpid(),i);
//sleep(3);
}
}
答案 0 :(得分:1)
在评论中,您提到将counter.c
编译为名为a.out
的可执行文件。如果未向编译器显式提供输出名称,那么这是缺省可执行文件名。因此,如果您同时编译counter.c
和main.c
,则其中只有一个将是a.out
。
您可以为gcc
提供一个选项,命名您的可执行文件与默认名称不同:
gcc -o counter counter.c
此外,您对execl
的调用并不完全正确。第一个参数是可执行文件的路径,但其余参数将变为argv[0]
,argv[1]
等。因此,您真的想以这种方式调用execl
:
execl("./counter", "counter", "5", NULL);
答案 1 :(得分:0)
阅读documentation of execl
for MacOSX和POSIX specification of execl
它可能会失败(这是它返回时的唯一情况)。所以代码:
if (childOrZero == 0){
printf("Child PID %d\n", (int)getpid());
execl("./counter", "5", NULL);
perror("execl counter");
exit(5);
}