繁体   English   中英

C-如何使用exec在后台运行程序?

[英]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 通常,您需要一些等待(例如, waitwaitpidwait4(2)等),以避免出现僵尸进程 您可能要处理SIGCHLD信号,但要读取signal(7)signal-safety(7)

也许您想使用daemon(3)函数。 另请参见setsid(2)setpgrp(2)凭据(7) 否则,您可能应该稍后在程序中调用wait 您可能想要重定向(使用dup2(2) ),也许重定向到/dev/null ,再重定向到其他一些open(2)编辑的文件描述符,再重定向到某些pipe(7) ,等等……, 标准输入 (和/或stdoutstderr )。 您可能还想使用poll(2)复用输入或输出。

您的代码应处理 fork(2) 的失败 (当它给出-1时),在这种情况下可能使用perror(3) 您还应该处理execvp(3)的故障。

在某些有限且特定的特定情况下,您可能希望对shnohup(1)batchatbash进行popen(3) ,但通常不需要这样做。

(在不了解您的动机以及为什么要在后台运行某些内容的情况 ,我们无法为您提供更多帮助)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM