在C语言Linux环境中使用fork和exec执行程序

3
我想在Linux中使用fork和exec系统调用来运行一个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;
}

3
你期望/bin/echo做什么? - DoxyLover
我不知道该写什么?我正在尝试理解它。 - user3392539
4个回答

5

argv[0]包含您程序的名称,而您正在Echo它。 完美无缺;-)


3

/bin/echo msg.c 将会把msg.c作为输出打印。如果你需要执行你的msg二进制文件,那么你需要修改你的代码为execv("path/msg");


2

你的exec执行打印出argv值的程序echo;
此外,如果msg.c是源文件,你不能"执行"它,你必须先编译(gcc msg.c -o msg),然后调用类似于exec("msg")的东西。


谢谢。但是您能否再详细解释一下,因为这是我第一次做这个。 - user3392539

2

C程序不是可执行文件(除非您使用不常见的C解释器)。

您需要先使用像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);

阅读 高级 Linux 编程
注:您可以将可执行文件命名为 msg 而不是 msg-prog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接