我想使用fork
和exec
系统调用在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;
}
答案 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
获取所有警告和-g
从gcc
编译器获取调试信息):
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);
注意:您可以仅将您的可执行文件命名为msg
而不是msg-prog
....