我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
void init_daemon() { pid_t pid; int i = 0;
if ((pid = fork()) == -1) { printf("Fork error !\n"); exit(1); } if (pid != 0) { exit(0); }
setsid(); if ((pid = fork()) == -1) { printf("Fork error !\n"); exit(-1); } if (pid != 0) { exit(0); } chdir("/tmp"); umask(0); for (; i < getdtablesize(); ++i) { close(i); }
return; }
int main(int argc, char *argv[]) { int fp; time_t t; char buf[] = {"This is a daemon: "}; char *datetime; int len = 0;
init_daemon();
while (1) { if (-1 == (fp = open("/tmp/daemon.log", O_CREAT|O_WRONLY|O_APPEND, 0600))) { printf("Open file error !\n"); exit(1); } len = strlen(buf); write(fp, buf, len); t = time(0); datetime = asctime(localtime(&t)); len = strlen(datetime); write(fp, datetime, len); close(fp); sleep(60); }
return 0; }
|