使用execv命令分叉和执行

时间:2016-10-08 17:33:31

标签: c linux

在Linux中,我正在尝试创建一个分叉和创建2个子节点(Child1和Child2)的C程序。每个孩子都在执行一个使用execv命令执行文件的过程。这是一个父文件,它创建两个文件destination1.txt和destination2.txt。这些文件的代码在Prcs_P1.c和Prcs_P2.c中。它们是C文件。代码编译并运行但不执行执行文件的操作。我究竟做错了什么?我错过了什么部分?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char *argv[])
{
pid child1, child2;
enter code here
child1 = fork();
errno = 0;

if (child1 < 0)
{
    printf("Error! Forking can't be done\n");
}

else if (child1 == 0)
{
    printf("Child one process activated! %d\n", getpid());
    execv("Prcs_P1.c", NULL);
}

else
{
    printf("Parent1 process activated! %d\n", getpid());
}

child2 = fork();

if (child2 < 0)
{
    printf("Error! Forking can't be done\n");
}

else if (child2 == 0)
{
    printf("Child two process activated! %d\n", getpid());
    execv("Prcs_P2.c",NULL);
}

else
{
    printf("Parent2 process activated! %d\n", getpid());
}

return 0;

}

输出是 Parent1进程已激活! 2614 Parent2进程已激活! 2614 孩子一个过程激活! 2615 Parent2进程已激活! 2615 孩子两个过程激活! 2617 孩子两个过程激活! 2616

2 个答案:

答案 0 :(得分:2)

您不应将“.c”文件作为输入传递。它不可执行。您必须将可执行文件作为输入传递。类似于“xxxxxx.out”。

答案 1 :(得分:2)

正如Pavan在另一个答案中指出的那样,您传递的是一个不可执行的文件作为execv的参数。你的意图是执行C程序,你不应该提供从该C程序编译的二进制文件吗?编译您希望子进程执行的C程序,适当地命名它们并输入execv

你应该抓住execv的返回值来查找它发生了什么。在您的情况下,它将返回错误 - &#34;执行格式错误&#34;。

if( execv("Prcs_P2.c",NULL) < 1)
      printf("execv failed with error %d\n",errno);