Wes Miller
Wes Miller

Reputation: 2231

C++ - How to detect I am running without a terminal

In C/C++ how can my programs determine if there is a desktop (system or remote) or not?

My project has three separate programs running (now) in separate gnome-terminals. It is launched by the last line of .profile, so it starts whether I am at the system desktop (gnome) or remotely connecting by VPN/telnet or VPN/remote-desktop. My machine is 250 miles away at a test site, so I frequently login remotely to make changes and have to restart the program.

I'd like my program to be able to detect that it is launched from a desktop environment or from a telnet session. Preferably, I want them to continue running after the remote connection is broken.

Obviously, I need to make my programs into daemons so they will persist after I close the connection. But if I start them in a terminal on a desktop environment, where I can actually have three terminals open, I'd like to watch their progress messages. And if I disconnect the remote desktop, I'd like the daemons to detect this and turn off printing (to the now killed terms) but keep on running in normal (silent) daemon mode. Best of all, the programs could recheck for a desktop occasionally and resume printing by opening new terminals.

Is this possible? Any coding suggestions?

Thanks in advance.

Upvotes: 2

Views: 1851

Answers (2)

James Kanze
James Kanze

Reputation: 153889

The traditional solution for this problem is an option in the command line. Such programs will typically demonize themselves unless given a special debug option telling them not to.

Another solution would be to use a shell script to start the program as a demon, via the nohup command (and redirecting standard input and output to /dev/null).

As for determining whether your managing terminal is local or not, it could be difficult; both X and telnet use virtual terminals, so if you're running under X, you may not be able to distinguish between a telnet session and a local xterm window. Still, it might be worth trying... Under Linux, /proc/<procid>/fd/0 is a symbolic link to the device connected to standard in (fd 0): using something like readlink, you should be able to determine the actual name. Or fstat will give you the major and minor numbers of the device. Given these, you might be able to determine which is which. If your local terminal is not under X, but a real terminal, it will definitely have a different minor number than a pseudo-terminal. For xterms, it's possible that the minor numbers of the pseudo-terminals fall in different ranges, or even that there are distinct sets of pseudo-terminals for remote links and for X; you'll probably have to experiment some, and there might be no working solution. (For starters, to tty at each terminal, and see what it says. I don't have local access to a Linux machine to check, but I seem to remember that on Solaris, X terminals had names like /dev/ttyxx; my remote terminals on Linux here are /dev/pts/xx. (Where xx is a number in each case.)

Upvotes: 0

Software_Designer
Software_Designer

Reputation: 8587

You can use the isatty function. 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");

You can find more information at http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html

Some more code: http://pastebin.com/S3Lr9tik

Upvotes: 2

Related Questions