c中的exec函数未运行

时间:2017-06-05 05:19:51

标签: c operating-system exec

由于我无法弄清楚的一些原因,我的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);
    }
}

2 个答案:

答案 0 :(得分:1)

在评论中,您提到将counter.c编译为名为a.out的可执行文件。如果未向编译器显式提供输出名称,那么这是缺省可执行文件名。因此,如果您同时编译counter.cmain.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 MacOSXPOSIX specification of execl

它可能会失败(这是它返回时的唯一情况)。所以代码:

if (childOrZero == 0){
    printf("Child PID %d\n", (int)getpid());
    execl("./counter", "5", NULL);
    perror("execl counter");
    exit(5);
}