C ++ - 如何检测我在没有终端的情况下运行

时间:2012-01-06 15:33:20

标签: c++ desktop daemon gnome

在C / C ++中,我的程序如何确定是否有桌面(系统或远程)?

我的项目有三个独立的程序(现在)在单独的gnome-terminal中运行。它由.profile的最后一行启动,因此无论我是在系统桌面(gnome)还是通过VPN / telnet或VPN /远程桌面进行远程连接,它都会启动。我的机器距离测试站点250英里,所以我经常远程登录进行更改,并且必须重新启动程序。

我希望我的程序能够检测到它是从桌面环境还是从telnet会话启动的。我希望它们在远程连接断开后继续运行。

显然,我需要将我的程序变成守护进程,以便在关闭连接后它们会持续存在。但是如果我在桌面环境中的终端上启动它们,我实际上可以打开三个终端,我想看看他们的进度消息。如果我断开远程桌面,我希望守护进程检测到这一点并关闭打印(对于现在被杀死的术语),但继续以正常(静默)守护进程模式运行。最重要的是,这些程序可以偶尔重新检查桌面,并通过打开新终端恢复打印。

这可能吗?任何编码建议?

提前致谢。

2 个答案:

答案 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

找到更多信息

更多代码:http://pastebin.com/S3Lr9tik

答案 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是一个 在每种情况下的数字。)