Linux守护进程加上发送信号固定模式

来源:互联网 发布:淘宝客好做不 编辑:程序博客网 时间:2024/06/06 03:43
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/shm.h>#include <ctype.h>#include <errno.h>int singnal1(int signo, void (*func)(int)){struct sigaction act, oact;act.sa_handler = func;sigemptyset(&act.sa_mask);act.sa_flags = 0;return sigaction(signo, &act, &oact);}void setdaemon(){pid_t pid, sid;pid = fork();if (pid < 0){exit(EXIT_FAILURE);}if (pid > 0){exit(EXIT_SUCCESS);}if ((sid = setsid()) < 0){printf("setsid failed %s\n", strerror(errno));exit(EXIT_FAILURE);/*chdir("/"); umask(0); close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO);*/}}void listenfifo(){const char *sfifoname = "fifo1";int len = 0;char buf[128];memset(buf, 0, sizeof(buf));int fd = open(sfifoname, O_RDONLY);//打开fifo管道文件if (fd == -1){printf("open %s failed, %s\n", sfifoname, strerror(errno));}len = read(fd, buf, sizeof(buf)); // 进程阻塞,直到数据来了才返回if (len > 0){if (buf[strlen(buf) - 1] == '\n'){buf[strlen(buf) - 1] = 0;}close(STDOUT_FILENO);open(buf, O_WRONLY);}close(fd);}void catch_Signal(int Sign){switch (Sign){case SIGINT:listenfifo();break;}}int main(void){setdaemon();//吧进程设置为daemon状态singnal1(SIGINT, catch_Signal);//捕捉int信号while (1){puts("!!!Hello World!!!");sleep(1);}return EXIT_SUCCESS;}

0 0
原创粉丝点击