From: Rainer T. <ta...@ta...> - 2009-04-09 13:21:17
|
Hello, here are some more information on daemon topic: This would be an example on how to use the SRC on AIX: If a daemon is defined to receive SRC requests through signals, a common strategy is to define the SRC subsystem such that file descriptor 0 is associated with /dev/null. The daemon then determines if file descriptor 0 is associated with a character special file that is not a terminal. If it is, the daemon assumes it has been started by the SRC. If file descriptor 0 is not associated with a character special file, or is associated with a character special file that is a terminal, the daemon assumes it has been started by a shell, and it should migrate itself to another process. This following example illustrates how a process can determine if it was started by the SRC. The example is not complete, in that it does not handle all the issues related to daemon initialization. #include <unistd.h> #include <fcntl.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mode.h> void create_child(void) { pid_t pid; if ((pid = fork()) == (pid_t)-1) { exit(1); } else if (pid != 0) { exit(0); } return; } void start_daemon(void) { struct sigaction sa; struct stat st; sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGHUP, &sa, NULL) == -1) { exit(1); } if (fstat(0, &st) < 0) { create_child(); } else { if ((st.st_mode & S_IFMT) == S_IFCHR) { if (isatty(0)) { create_child(); } } else { create_child(); } } (void) setsid(); return; } Bye Rainer |