C - 程序终止(fork()和exec())

时间:2017-01-17 01:54:31

标签: c linux

我有以下代码:

int main(int argc, char **argv)
{
    char    *program;
    char     stringa[1000] = "";
    int num = 123;
    char snum[5];

    program = argv[1];

    sprintf(stringa, "./%s", program);

    pid_t pid = fork();
    if (pid < 0 ) {
        perror("fork failed."); 
        exit(1); }

    else if (pid == 0) {
        char* args[] = {stringa, NULL};
        execv(args[0], args);
    }

    else {
        char procmon_str[] = "./procmon ";
        num = pid;
        sprintf(snum, "%d",num);
        printf("PID of child is %s", snum);

        char* args2[] = {procmon_str, snum, NULL};
        execv(args2[0], args2);

        sleep(20);
        kill(num, SIGTERM);

        sleep(2);
        int parent_pid = getpid(); 
        printf("PID of parent is %d", parent_pid);
        kill(parent_pid, SIGTERM);

    }

    wait(NULL);

    return 0;
}

这个想法是使用1个命令行参数调用程序,该参数是同一文件夹中另一个已编译的C程序的名称。 我想从C代码中执行该程序(因此使用fork()),同时我想从parent fork()部分内启动另一个程序

child fork()部分中的部分完美无缺,但是当我在shell中运行时,它会立即显示Terminated并且不会执行parent中的代码{1}} fork()的一部分。

为什么?

1 个答案:

答案 0 :(得分:1)

  1. 您的程序调用{​​{1}}。现在父进程和子进程的执行并行进行。

  2. 孩子:

    • 构建参数数组fork()
    • 调用args[]并替换为作为参数提供的程序。
  3. 父母与孩子并行:

    • 构建参数数组execv()
    • 致电args2[]并替换为execv()
  4. ./procmon以后的代码未到达,除非sleep(20)失败(您未检查)。

    再次阅读execv()的手册页,然后重做程序的逻辑。