在C/C++中,我的程序如何确定是否有桌面(系统或远程)?
我的项目有三个独立的程序(现在)在不同的gnome终端上运行。它是由.profile的最后一行启动的,所以无论我是在系统桌面(gnome)还是通过VPN/telnet或VPN/remote- last进行远程连接,它都会启动。我的机器在250英里外的一个测试站点,所以我经常远程登录进行更改,并且必须重新启动程序。
我希望我的程序能够检测到它是从桌面环境还是从telnet会话启动的。最好,我希望它们在远程连接断开后继续运行。
显然,我需要使我的程序成为守护进程,以便它们在我关闭连接后仍然存在。但如果我在桌面环境的终端中启动它们,我实际上可以打开三个终端,我想查看它们的进度消息。如果我断开了远程桌面的连接,我希望守护进程检测到这一点,并关闭打印(按照现在取消的术语),但继续在正常(静默)守护进程模式下运行。最棒的是,这些程序可以偶尔重新检查桌面,并通过打开新的终端来恢复打印。
这个是可能的吗?有什么编码建议吗?
提前谢谢。
发布于 2012-01-06 16:08:35
您可以使用isatty
函数。Detect if stdin is a terminal or pipe?
#include <stdio.h>
#include <io.h>
//...
if (isatty(fileno(stdin)))
printf( "stdin is a terminaln" );
else
printf( "stdin is a file or a pipen");
你可以在http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html上找到更多信息
发布于 2012-01-06 16:21:25
这个问题的传统解决方案是命令行中的一个选项。这类程序通常会妖魔化自己,除非给它们一个特殊的调试选项,告诉它们不要这样做。
另一种解决方案是使用/dev/null
脚本通过nohup
命令(并将标准输入和输出重定向到shell )作为后台程序启动程序。
至于确定您的管理终端是否在本地,这可能很困难;X和telnet都使用虚拟终端,因此如果您在X下运行,您可能无法区分telnet会话和本地xterm窗口。不过,这可能值得一试。在Linux下,/proc/<procid>/fd/0
是一个连接到(Fd0)中标准设备的符号链接:使用类似readlink
的东西,您应该能够确定实际名称。或者fstat
会给你设备的主号和次号。考虑到这些,您也许能够确定哪一个是哪一个。如果您的本地终端不在X下,而是一个真实的终端,那么它肯定会有一个与伪终端不同的次要编号。对于xterm,伪终端的次要数字可能落在不同的范围内,甚至可能存在用于远程链接和X的不同的伪终端集;您可能不得不尝试一些,可能没有有效的解决方案。(对于初学者,在每个终端上使用tty
,看看它说了什么。我不能本地访问Linux机器进行检查,但我似乎记得在Solaris上,X终端的名称类似于/dev/ttyxx
;我在Linux上的远程终端是/dev/pts/xx
。(其中xx
在每种情况下都是一个数字。)
https://stackoverflow.com/questions/8760255
复制