[英]C - How do I run a program in the background using exec?
我可以在终端上运行一个程序,如下所示: ./program &
但是我正在尝试使用execvp来执行此操作,但它不起作用:
pid = fork();
char *argv[3] = {"./program", "&", NULL};
if ( pid == 0 ) {
execvp( argv[0], argv );
}
else{
wait(NULL);
}
我在这里做错了什么?
您在argv
数组中使用的"&"
将无法执行您想要的操作,并且可能是您在此处遇到问题的根源。 那是程序参数的地方, &
是shell命令,而不是程序参数。 删除它是因为自./program
以来,。/ ./program
将./program
在单独的进程中运行。
正如Greg Hewgill回答的那样 ,结尾&
是与作业控制有关的shell语法(从技术上讲,这不是shell命令)。
在您的问题中,不清楚您为什么需要它。 您不能使用该"&"
,您的代码应该可以正常工作。 还请阅读有关后台进程 , 终端仿真器和进程组的信息 。 阅读揭开神秘面纱的tty 。
顺便说一句,您可以使用waitpid(2)并指定pid来代替wait
。 通常,您需要一些等待(例如, wait
, waitpid
, wait4(2)等),以避免出现僵尸进程 。 您可能要处理SIGCHLD
信号,但要读取signal(7)和signal-safety(7) 。
也许您想使用daemon(3)函数。 另请参见setsid(2) , setpgrp(2)和凭据(7) 。 否则,您可能应该稍后在程序中调用wait
。 您可能想要重定向(使用dup2(2) ),也许重定向到/dev/null
,再重定向到其他一些open(2)编辑的文件描述符,再重定向到某些pipe(7) ,等等……, 标准输入 (和/或stdout和stderr )。 您可能还想使用poll(2)复用输入或输出。
您的代码应处理 fork(2) 的失败 (当它给出-1时),在这种情况下可能使用perror(3) 。 您还应该处理execvp(3)的故障。
在某些有限且特定的特定情况下,您可能希望对sh
, nohup(1) , batch
, at
或bash
进行popen(3) ,但通常不需要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.