How to make an application to prevent itself from launching from the command line?
I have a binary which should be launched by a daemon; but when somebody tries to launch the binary from command line, I should error out stating "cannot be launched from command line".
Tried googling but in vain.

My first approach would probably be to check the parent process and kill the program if the parent is a shell, like bash or csh.

Another approach would be to see if stdin is attached to a real terminal. A process that is spawned by a daemon would have no stdin device, or it would be /dev/null.

commented: never mind.. i got it! +0

@deceptikon, i need to check parent name against all the possible shells.. is that what you are suggesting? sounds fine to me.. but i was looking for other approaches which would take lesser lines of code..
@rubberman, that makes sense.. will you please spare time to tell me how to check if stdin device of a process is /dev/null or not?

In C, you can #include <unistd.h> and then use the ttyname(0) function. It resturns a pointer to the terminal that fd 0 (stdin) is connected with, or NULL if it isn't attached to a terminal (or there is an error) - checking errno for ENOTTY will tell you if it is not attached. From the Linux ttyname(3) man page:

TTYNAME(3)                 Linux Programmer’s Manual                TTYNAME(3)

       ttyname, ttyname_r - return name of a terminal

       #include <unistd.h>

       char *ttyname(int fd);

       int ttyname_r(int fd, char *buf, size_t buflen);

       The function ttyname() returns a pointer to the null-terminated pathname of the terminal device that is open on
       the file descriptor fd, or NULL on error (for example, if fd is not connected to a terminal).  The return value
       may point to static data, possibly overwritten by the next call.  The function ttyname_r() stores this pathname
       in the buffer buf of length buflen.

       The function ttyname() returns a pointer to a pathname on success.  On error, NULL is returned,  and  errno  is
       set appropriately.  The function ttyname_r() returns 0 on success, and an error number upon error.


       EBADF  Bad file descriptor.

       ENOTTY File descriptor does not refer to a terminal device.

       ERANGE buflen was too small to allow storing the pathname.

       4.2BSD, POSIX.1-2001.

       fstat(2), isatty(3)

       This  page  is part of release 3.22 of the Linux man-pages project.  A description of the project, and informa-
       tion about reporting bugs, can be found at

Linux                             2008-07-14                        TTYNAME(3)

@rubberman, thanks for the info!.. I think "isatty(STDIN_FILENO)" will serve my purpose..