Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以从终端运行程序,并在关闭终端后使其继续运行?_C_Linux - Fatal编程技术网

C 是否可以从终端运行程序,并在关闭终端后使其继续运行?

C 是否可以从终端运行程序,并在关闭终端后使其继续运行?,c,linux,C,Linux,我已经编写了一个程序,在通过SSH连接到box之后运行。它有一些用户交互,比如在收到提示后选择选项,通常我会等待它执行的过程完成,然后再注销,从而关闭终端并结束程序。但是现在这个过程相当长,我不想在登录时等待,那么我如何才能在C中实现此解决方案呢?您可以在后台通过使用带“&”的命令运行程序 wget-m www.google.com& 或者,您可以使用“screen”程序,它允许您附加deattach会话 屏幕wget-m www.google.com (按CTRL+D组合键) 屏幕-r(重新连

我已经编写了一个程序,在通过SSH连接到box之后运行。它有一些用户交互,比如在收到提示后选择选项,通常我会等待它执行的过程完成,然后再注销,从而关闭终端并结束程序。但是现在这个过程相当长,我不想在登录时等待,那么我如何才能在C中实现此解决方案呢?

您可以在后台通过使用带“&”的命令运行程序

wget-m www.google.com&

或者,您可以使用“screen”程序,它允许您附加deattach会话

屏幕wget-m www.google.com

(按CTRL+D组合键)

屏幕-r(重新连接)


您可以使用screen命令。注意:您可能需要将其安装到您的系统中。

当外壳退出时,将向进程发送HUP信号。您所要做的就是安装一个忽略SIGHUP的信号处理程序


或者使用nohup运行程序

执行此操作的传统方法是使用nohup(1)命令:

nohup mycmd&output.log&
当然,如果您不关心输出,也可以将其发送到/dev/null,或者如果需要,也可以从文件中获取输入

这样做将保护您的进程不受通常会导致其退出的死机的影响。您还需要像上面那样重定向stdin/stdout/stderr,因为您将结束ssh会话

上面显示的语法是针对bash的。

有许多选项:-)TIMTOWTDI…但是,出于您的目的,您可以考虑运行命令行实用程序,例如
dtach
或GNU
screen


如果你真的想用C实现一些东西,你可以重新发明这个轮子,但是从你对这个问题的描述来看,我怀疑它是否有必要…

实际的C代码对后台进程来说是微不足道的:

//do interactive stuff...  
if(fork())
     exit(0);
//cool, I've been daemonized.
如果您知道代码永远不会出现在非linux或BSD机器上,您甚至可以使用
daemon()


因此,如果我像./program&那样运行程序,我仍然可以像正常一样与程序进行交互,但是当我关闭终端时,即使在注销后,它仍然在后台运行?不,如果您使用“&”运行程序,它将进入后台,但仍然输出到终端-但是您将无法与它进行交互。关闭终端后,它将继续工作。对于你所描述的,我明确建议使用“屏幕”——它非常有用。你的意思是它不能接受用户输入,但你可以让它报告它在做什么,例如?确切地说——通过屏幕,你可以像正常一样与它交互。用GUI术语把它想象成一个模拟窗口。你可以通过重新连接回到它,它将继续在后台运行,即使你结束了会话(只要你解除了它)。当我关闭终端时,我的程序也关闭了。你如何使用nohup运行程序?这对shell中与程序的交互有任何负面影响吗?谢谢,语法应该是“nohup命令参数&”。这意味着程序输出被写入一个名为nohup.out的文件——除非你将其重定向到另一个文件——并且stdin没有连接到终端。哦,但是你的程序是交互式的。在这种情况下,你需要屏幕。为什么用C?为什么Perl中的解决方案不好??我希望把所有的代码都保存在用C编写的实际程序中。不幸的是,您将无法与该程序交互。这是真的——我最初错过了问题的这一部分。但是,如果交互以可预测的方式进行,那么用户输入可以放在一个文件中,文件可以在stdin上重定向。真的是这样吗?因此,我可以在程序结束时使用它,并在终端仍在后台执行过程时退出终端(没有进一步的输出/输入打印)?更好的解决方案可能是调用
守护进程
函数。您甚至可以测试它:
main(){int k=getchar();printf(“%c\n”,k);if(fork())退出(0);pause();}
,然后关闭终端,并
ps ax | grep a.out
。一切都会一目了然。@BasileStarynkevitch
daemon()
不是POSIX,但问题被标记为Linux,并且
daemon
是由Linux提供的。老实说,我很想从C实现这个解决方案,而不是依赖盒子上现有的程序。
//do interactive stuff...  
if(fork())
     exit(0);
//cool, I've been daemonized.
//interactive...
daemon(0, 0);
//background...