使用fork和exec在C linux中执行程序

时间:2014-03-14 10:50:22

标签: c linux fork system-calls

我想使用forkexec系统调用在Linux中执行C程序。 我写了一个程序 msg.c ,它运行正常。然后我写了一个程序 msg1.c

当我执行./a.out msg.c时,它只是打印msg.c作为输出但不执行我的程序。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */

int main(int argc,char** argv)
{
/*Spawn a child to run the program.*/
    pid_t pid=fork();
    if (pid==0)
    { /* child process */
    //      static char *argv[]={"echo","Foo is my name.",NULL};
            execv("/bin/echo",argv);
            exit(127); /* only if execv fails */
    }
    else
    { /* pid!=0; parent process */
           waitpid(pid,0,0); /* wait for child to exit */
    }
 return 0;
}

4 个答案:

答案 0 :(得分:5)

argv [0]包含你的程序名称,你正在回应它。 完美无瑕; - )

答案 1 :(得分:3)

/ bin / echo msg.c将打印msg.c作为输出,如果您需要执行msg二进制文件,则需要将代码更改为 execv(“path / msg”); < / p>

答案 2 :(得分:2)

你的exec执行程序echo,打印出argv的值是什么;
而且你不能执行&#34; msg.c如果它是一个源文件,你必须首先编译它(gcc msg.c -o msg),然后调用exec("msg")

之类的东西

答案 3 :(得分:1)

C程序不是executables(除非你使用不常见的C解释器)。

您需要先使用compiler GCC编译它们,然后将msg.c源文件编译成msg-prog可执行文件(使用-Wall获取所有警告和-ggcc编译器获取调试信息):

gcc -Wall -g msg.c -o msg-prog

注意改善msg.c,直到没有警告为止。

然后,您可能希望将源代码中的execv替换为更合理的内容。阅读execve(2)execl(3)以及perror(3)。考虑使用

execl ("./msg-prog", "msg-prog", "Foo is my name", NULL);
perror ("execl failed");
exit (127);

阅读Advanced Linux Programming

注意:您可以仅将您的可执行文件命名为msg而不是msg-prog ....