2017-10-21 31 views
0

有一个程序,我可以像这样在终端中运行:./program &C - 如何使用exec在后台运行程序?

但我试图做使用execvp它,它不工作:

  pid = fork(); 
      char *argv[3] = {"./program", "&", NULL}; 

      if (pid == 0) { 
       execvp(argv[0], argv); 
      } 
      else{ 
       wait(NULL); 
      } 

我干了什么错在这里做什么?

+0

普莱舍**编辑您的问题**来激励它,真正解释你想做。 –

回答

2

您在argv阵列中的"&"不会执行您想要的操作,并且可能是您的问题的来源。这是一个程序参数的地方,&是一个shell命令,而不是程序参数。删除它,因为./program由于分叉而将在单独的进程中运行。

+2

我会说'&'是一个shell *语法*;它本身不是一个命令。 –

1

由于answered by Greg Hewgill,结尾&是与job control相关的shell语法(它在技术上不是shell命令)。

在你的问题,目前还不清楚为什么你需要它。你可以不使用"&",你的代码应该可以工作。另请参阅约background processes,约terminal emulators,约process groups。阅读tty demystified

顺便说一句,你可以代替wait使用waitpid(2)并指定PID。您一般需要等待一些(例如waitwaitpidwait4(2),等...),以避免zombie processes。您可能要处理的SIGCHLD信号,但读signal(7) & signal-safety(7)

也许你想使用daemon(3)功能。另请参阅setsid(2)setpgrp(2)credentials(7)。否则,您可能应该在程序中稍后调用wait。你可能想(用dup2(2))重定向,也许是/dev/null,其他一些open(2) -ed文件描述符,一些pipe(7),等等,的标准输入(和/或标准输出标准错误)您子进程。您可能还想要使用poll(2)来复用输入或输出。

您的代码应为handle the failurefork(2)(当它给出-1)时,可能在此情况下使用perror(3)。您还应该处理execvp(3)的失败。

在一些有限的和具体的特殊情况下,你可以想popen(3)一个shnohup(1)batchat,或bash但通常不需要这样。

(不理解你的动机,为什么要在background运行的东西,我们不能帮助你更多)