在C / C ++中,我的程序如何确定是否有桌面(系统或远程)?
我的项目有三个独立的程序(现在)在单独的gnome-terminal中运行。它由.profile的最后一行启动,因此无论我是在系统桌面(gnome)还是通过VPN / telnet或VPN /远程桌面进行远程连接,它都会启动。我的机器距离测试站点250英里,所以我经常远程登录进行更改,并且必须重新启动程序。
我希望我的程序能够检测到它是从桌面环境还是从telnet会话启动的。我希望它们在远程连接断开后继续运行。
显然,我需要将我的程序变成守护进程,以便在关闭连接后它们会持续存在。但是如果我在桌面环境中的终端上启动它们,我实际上可以打开三个终端,我想看看他们的进度消息。如果我断开远程桌面,我希望守护进程检测到这一点并关闭打印(对于现在被杀死的术语),但继续以正常(静默)守护进程模式运行。最重要的是,这些程序可以偶尔重新检查桌面,并通过打开新终端恢复打印。
这可能吗?任何编码建议?
提前致谢。
答案 0 :(得分:1)
您可以使用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
找到更多信息答案 1 :(得分:0)
此问题的传统解决方案是命令中的一个选项 线。这些节目通常会将自己妖魔化,除非给出一个 特殊的调试选项告诉他们不要。
另一个解决方案是使用shell脚本启动程序
一个恶魔,通过nohup
命令(并重定向标准输入和
输出到/dev/null
)。
至于确定您的管理终端是否为本地终端
可能很难; X和telnet都使用虚拟终端,所以如果
你在X下运行,你可能无法区分a
telnet会话和本地xterm窗口。不过,它可能值得
尝试...在Linux下,/proc/<procid>/fd/0
是一个符号链接
连接到(fd 0)标准的设备:使用readlink
之类的东西,
你应该能够确定实际的名字。或者fstat
会给出
你是设备的主要和次要号码。鉴于这些,您可能
能够确定哪个是哪个。如果您的本地终端不是
在X下,但真正的终端,它肯定会有一个不同的小调
数字比伪终端。对于xterms,未成年人可能
伪终端的数量落在不同的范围内,甚至是不同的
远程链路和X有不同的伪终端集;
你可能要试验一些,但可能没有用
解。 (对于初学者,每个终端的tty
,看看它是什么
说。我没有本地访问Linux机器来检查,但我似乎
要记住,在Solaris上,X终端的名称类似于/dev/ttyxx
;我的
Linux上的远程终端是/dev/pts/xx
。 (xx
是一个
在每种情况下的数字。)