小编典典

系统调用fork()和execv函数

linux

我正在尝试使用此C代码连续运行两个可执行文件:

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    fork();
    execv("./prcs1", &argv[1]); // GIVE ADDRESS OF 2nd element as starting point to skip source.txt
    fork();
    execv("./prcs2", argv);
    printf("EXECV Failed\n");
}

尽管有分叉,但在第一个execv()调用之后,程序将退出,它永远不会到达第二个execv()。我试过在第一次fork之后调用wait(),但是我不确定那是缺少的内容。

有什么想法为什么在孩子退出后控制权不返回给父母?


阅读 1086

收藏
2020-06-03

共1个答案

小编典典

你有几个问题。首先,如果只想运行两个程序,则只需调用fork()一次。然后在父进程中运行一个程序,在子进程中运行一个程序。其次,您正在构造argvexecv错误地传递给的数组。第一个条目应该是可执行文件名称。做类似的事情:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    pid_t i = fork();
    if (i == 0)
    {
        execv("./prcs1", (char *[]){ "./prcs1", argv[1], NULL });
        _exit(1);
    }
    else if (i > 0)
    {
        execv("./prcs2", (char *[]){ "./prcs2", argv[0], NULL });
        _exit(2);
    }
    else
    {
        perror("fork failed");
        _exit(3);
    }
}

请注意,此示例不进行错误检查。

2020-06-03