just make sure you start it as some other user than root. David A. Cafaro wrote:
>Just curious but what is wrong with just writing a program that doesn't >put out any text to the console and starting it with a script with a >command like this: > >mydaemon& > >Besides the fact that it's a little less elegant? > >It's been a long long time since I did C/C++ coding and righting >daemons. I'm planning on writing up a little tcp/ip daemon for my >Zaurus. Thanks for any input. > >-David > >On Thu, 2002-05-23 at 19:13, M. Mueller wrote: > > >>On Thursday 23 May 2002 06:40 pm, Peter Long reputedly wrote: >> >> >> >>>Hi all, >>> >>>I have a console application that I want to turn into a daemon. Does anyone >>>know where I can find documentation on how to do that. >>> >>>Thanks in advance. >>> >>> >>Here's my daemon launcher. It is more than a basic daemon launcher because I >>have N daemons that all talk to each other. Furthermore, I don't want any >>daemons to start doing business until all the other daemons are ready. >> >>-- >>Mike Mueller >>www.ss7box.com >>---- >> >> >> > > > >>#include <sys/stat.h> >>#include <sys/msg.h> >>#include <fcntl.h> >>#include <syslog.h> >>#include <stdio.h> >>#include <unistd.h> >>#include <errno.h> >>#include "ipc_mq.h" >> >>#define MAX_DAEMONS 5 >>#define DAEMON_PATH "usr/local/ss7t/bin/" >> >>char *env_init[] = {"USER=mtp3d", "PATH=/tmp", NULL}; >>char *daemon_names[][MAX_DAEMONS] = { >> "mtp3_d", >> "tali_d", >>// "sctp_d", >> "oam_d", >> "mr_d", >> "ps_d" >> }; >> >>int sockfd; >>struct sockaddr_in myaddr, peeraddr; >>t_ipc_mqbuf mb; >>socklen_t sockaddrlen; >> >>void get_busy (unsigned int daemon_id) >>/****************************************************************************** >>******************************************************************************/ >>{ >>int r; >> >> bzero(&peeraddr, sizeof(peeraddr)); >> peeraddr.sin_family = AF_INET; >> peeraddr.sin_port = htons(daemon_id); >> r = inet_pton(AF_INET, IPC_ADDR_STR, &peeraddr.sin_addr.s_addr); >> if (r == -1) >> { >> syslog (LOG_INFO, "F:daemon_launcher:get_busy:inet_pton failed:%s", >> strerror(errno)); >> exit (-1); >> } >> >> bzero (&mb, sizeof(mb)); >> mb.mhdr.s_id = DLAUNCH_ID; // this is the letter sender >> mb.mhdr.mcode = IPC_PROCEED; >> mb.mhdr.mlen = sizeof(t_ipc_mb_hdr); >> >> r = sendto (sockfd, &mb, mb.mhdr.mlen, NOFLAGS, >> &peeraddr, sizeof (peeraddr)); >> if (r == -1) >> { >> syslog (LOG_INFO, "F:get busy:sendto failed:cause %s target: %s", >> strerror(errno), daemon_id); >> exit (-1); >> } >>} >> >>int daemon_init(char *p_daemon_fname) >>/****************************************************************************** >>******************************************************************************/ >>{ >>char daemon_pathname [128]; >> pid_t pid; >> >> if ( (pid = fork()) < 0) >> return(-1); >> else if (pid != 0) >> return (0); /* the parent process returns from this function here >*/ >> >>// the child process continues here >> >> setsid(); /* become session leader */ >> chdir("/"); /* change working directory */ >> umask(0); /* clear our file mode creation mask */ >> >> if ((strlen (p_daemon_fname) + strlen (DAEMON_PATH)+ 1) > sizeof >(daemon_pathname)) >> { >> syslog (LOG_INFO, "daemon pathname too long"); >> exit (-1); >> } >> >>// exec the daemon in the child process >> >> execl ( >> strcat (strcpy (daemon_pathname,DAEMON_PATH), p_daemon_fname), >> p_daemon_fname, >> (char *) 0 >> ); >> >>// should never reach this statement >> >> exit(0); >>} >> >>int daemon_comm_ready (void) >>/****************************************************************************** >>******************************************************************************/ >>{ >>ssize_t bw; >>u_long daemons_ready; >> >> daemons_ready = 0; >> >> for (;;) >> { >>// blocking read; wait for a daemon to report for duty; if this becomes >>// a block-forever condition, then one must resort to killing process >>// use "ps -axj" as superuser to find the processes to be killed >> >> bw = recvfrom (sockfd, &mb, sizeof (mb), NOFLAGS, >> &peeraddr, &sockaddrlen); >> if (bw == -1) >> { >> syslog (LOG_INFO, "F:daemon_comm_ready:recvfrom failed"); >> exit (-1); >> } >> >>// show who's ready for duty; add a string termination >> >> //mb.mdata[mb.mhdr.mlen - sizeof(t_ipc_mb_hdr)] = '\0'; >> syslog (LOG_INFO, "I:mb contents:s_id %d daemon on duty: %s", >> mb.mhdr.s_id, >> &mb.mdata); >> >> daemons_ready = daemons_ready | mb.mhdr.s_id; >> if (daemons_ready == ALL_DAEMONS_READY) >> { >> syslog (LOG_INFO, "I:daemon_comm_ready:all daemons ready"); >> break; >> } >> } // end of for loop >> >>// tell the daemons that IPC may proceed >> >> get_busy (MTP3_PORT); >> get_busy (TALI_PORT); >>// get_busy (SCTP_IPC_PORT); >> get_busy (OAM_PORT); >> get_busy (MR_PORT); >> get_busy (PS_PORT); >>} >> >>int configure_dl() >>/****************************************************************************** >>******************************************************************************/ >>{ >> //dlConf = new c_confReader("dl"); >> //delete dlConf >>} >> >>int main (int argc, char **argv) >>/****************************************************************************** >>******************************************************************************/ >>{ >>int d; >>int r; >> >> openlog ("daemon_init" ,LOG_PID, LOG_USER); >> syslog (LOG_INFO ,"Daemon launcher starting"); >> >>// read daemon launcher conf file >> >> configure_dl(); >> >> sockfd = socket(AF_INET, SOCK_DGRAM, 0); >> if (sockfd == -1) >> { >> syslog (LOG_INFO, "socket failed"); >> exit (-1); >> } >> >>// create an Internet Protocol address >> >> bzero(&myaddr, sizeof(myaddr)); >> myaddr.sin_family = AF_INET; >> myaddr.sin_port = htons(DLAUNCH_PORT); >> r = inet_pton(AF_INET, IPC_ADDR_STR, &myaddr.sin_addr.s_addr); >> if (r == -1) >> { >> syslog (LOG_INFO, "I:daemon_launcher:main:inet_pton failed:%s", >> strerror(errno)); >> exit (-1); >> } >> >> r = bind (sockfd, (const struct sockaddr *) &myaddr, sizeof(myaddr)); >> if (r == -1) >> { >> syslog (LOG_INFO, "bind failed"); >> exit (-1); >> } >> >> for (d = 0; d < MAX_DAEMONS; d++) >> { >> if (daemon_init (daemon_names [0][d]) == -1) >> { >> syslog (LOG_INFO, "fork failed; daemon ID: %s\n", >daemon_names[d]); >> return (-1); >> } >> } >> >> if (daemon_comm_ready () == -1) >> { >> } >> return (0); >>} >> >> > > > >_______________________________________________ >Dev mailing list >[EMAIL PROTECTED] >http://www.trilug.org/mailman/listinfo/dev > > > _______________________________________________ Dev mailing list [EMAIL PROTECTED] http://www.trilug.org/mailman/listinfo/dev