个人主页https://xugaoxiang.com,微信公众号: Dev_Club 或者搜索 程序员Club
全部博文(229)
分类: LINUX
2010-10-09 15:28:08
In UNIX and other multitasking operating systems, a daemon is a computer program that runs in the background, rather than under the direct control of a user; they are usually initiated as background processes. Typically daemons have names that end with the letter "d": for example,httpd, the daemon that handles the HTTP requirements, or sshd, which handles incoming SSH connections.
In a Unix environment, the parent process of a daemon is often (but not always) the init process (pid=1). Processes usually become daemons by forking a child process and then having their parent process immediately exit, thus causing init to adopt the child process. This is a somewhat simplified view of the process as other operations are generally performed, such as dissociating the daemon process from any controlling tty.
/*daemon.c*/
#include
#include
#include
#include
#include
#include
#include
void initDaemon(void)
{
int pid;
int i;
/* terminate parent process */
if(pid=fork())
exit(0);
/* exit when fork failed */
else if(pid< 0)
exit(1);
/* continue only when it it the first child process
** run in a new session
*/
setsid();
/* seperate from terminator,kill the first child process */
if(pid=fork())
exit(0);
else if(pid< 0)
exit(1);
/* close all file descriptors */
for(i=0;i< NOFILE;++i)
close(i);
chdir("/home/djstava");
/* reset file umask */
umask(0);
return;
}
void signalUSR1(int signal)
{
/*handle SIGUSR1*/
FILE *fp;
time_t t;
if((fp=fopen("log","a")) >=0)
{
t=time(0);
fprintf(fp,"Received signal(%d),at %s\n", signal, asctime(localtime(&t)) );
fclose(fp);
}
}
int main(int argc, char ** argv)
{
FILE *fp;
time_t t;
initDaemon();
/* ignore signal */
signal(SIGCHLD, SIG_IGN);
/* handle SIGUSR1 */
signal(SIGUSR1, signalUSR1);
while(1)
{
sleep(60);
if((fp=fopen("log","a")) >=0)
{
t=time(0);
fprintf(fp,"djstava at %s\n",asctime(localtime(&t)) );
fclose(fp);
}
}
}
Now compile the example and execute it like this.
gcc -o daemon daemon.c
./daemon
ps ax
sudo kill -s SIGUSR1 6942
cat /home/djstava/log
Finally,add a line to the file /etc/rc.local,and cp the executable file to the dir /bin.That's down,daemon will run when the system boots.
su - djstava -c "/bin/daemon"
References:
SIGHUP | 1 | Exit | Hangup |
SIGINT | 2 | Exit | Interrupt |
SIGQUIT | 3 | Core | Quit |
SIGILL | 4 | Core | Illegal Instruction |
SIGTRAP | 5 | Core | Trace/Breakpoint Trap |
SIGABRT | 6 | Core | Abort |
SIGEMT | 7 | Core | Emulation Trap |
SIGFPE | 8 | Core | Arithmetic Exception |
SIGKILL | 9 | Exit | Killed |
SIGBUS | 10 | Core | Bus Error |
SIGSEGV | 11 | Core | Segmentation Fault |
SIGSYS | 12 | Core | Bad System Call |
SIGPIPE | 13 | Exit | Broken Pipe |
SIGALRM | 14 | Exit | Alarm Clock |
SIGTERM | 15 | Exit | Terminated |
SIGUSR1 | 16 | Exit | User Signal 1 |
SIGUSR2 | 17 | Exit | User Signal 2 |
SIGCHLD | 18 | Ignore | Child Status |
SIGPWR | 19 | Ignore | Power Fail/Restart |
SIGWINCH | 20 | Ignore | Window Size Change |
SIGURG | 21 | Ignore | Urgent Socket Condition |
SIGPOLL | 22 | Ignore | Socket I/O Possible |
SIGSTOP | 23 | Stop | Stopped (signal) |
SIGTSTP | 24 | Stop | Stopped (user) |
SIGCONT | 25 | Ignore | Continued |
SIGTTIN | 26 | Stop | Stopped (tty input) |
SIGTTOU | 27 | Stop | Stopped (tty output) |
SIGVTALRM | 28 | Exit | Virtual Timer Expired |
SIGPROF | 29 | Exit | Profiling Timer Expired |
SIGXCPU | 30 | Core | CPU time limit exceeded |
SIGXFSZ | 31 | Core | File size limit exceeded |
SIGWAITING | 32 | Ignore | All LWPs blocked |
SIGLWP | 33 | Ignore | Virtual Interprocessor Interrupt for Threads Library |
SIGAIO | 34 | Ignore | Asynchronous I/O |
djstava
chinaunix网友2010-10-10 15:38:33
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com