来源:http://bbs.chinaunix.net/archiver/?tid-393658.html
UNIX Programming FAQ 中文版 v0.1.0(转)
一个使用以上函数的范例程序:
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <stdio.h>;
#include <stdlib.h>;
#include <syslog.h>;
#include <errno.h>;
int daemon(int,int);
int fork2(void);
void closeall(int);
#define TCP_PORT 8888
void errexit(const char *str)
{
syslog(LOG_INFO, "%s failed: %d (%m)", str, errno);
exit(1);
}
void errreport(const char *str)
{
syslog(LOG_INFO, "%s failed: %d (%m)", str, errno);
}
/* 实际的子进程在此. */
void run_child(int sock)
{
FILE *in = fdopen(sock,"r");
FILE *out = fdopen(sock,"w");
int ch;
setvbuf(in, NULL, _IOFBF, 1024);
setvbuf(out, NULL, _IOLBF, 1024);
while ((ch = fgetc(in)) != EOF)
fputc(toupper(ch), out);
fclose(out);
}
/* 这是守护程序的主要工作 -- 侦听连接并生成子进程 */
void process()
{
struct sockaddr_in addr;
int addrlen = sizeof(addr);
int sock = socket(AF_INET, SOCK_STREAM, 0);
int flag = 1;
int rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
&flag, sizeof(flag));
if (rc < 0)
errexit("setsockopt");
addr.sin_family = AF_INET;
addr.sin_port = htons(TCP_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
rc = bind(sock, (struct sockaddr *) &addr, addrlen);
if (rc < 0)
errexit("bind");
rc = listen(sock, 5);
if (rc < 0)
errexit("listen");
for (;;)
{
rc = accept(sock, (struct sockaddr *) &addr, &addrlen);
if (rc >;= 0)
switch (fork2())
{
case 0:close(sock); run_child(rc); _exit(0);
case -1: errreport("fork2"); close(rc); break;
default: close(rc);
}
}
}
int main()
{
if (daemon(0,0) < 0)
{
perror("daemon");
exit(2);
}
openlog("test", LOG_PID, LOG_DAEMON);
process();
return 0;
}
#include <unistd.h>;
#include <stdlib.h>;
#include <fcntl.h>;
#include <signal.h>;
#include <sys/types.h>;
#include <sys/wait.h>;
#include <errno.h>;
/* closeall() -- 关闭所有>;=给定值的文件描述符 */
void closeall(int fd)
{
int fdlimit = sysconf(_SC_OPEN_MAX);
while (fd < fdlimit)
close(fd++);
}
/* daemon() - 将进程从用户端脱离并消失进入后台,若失败返回-1,
* 但是在那种情况下你只能退出,因为我们可能已经生成了子进程。
* 这是基于BSD的版本,所以调用方需负责类似umask等等其它的工作。
*/
/* 相信在所有Posix系统上都能工作 */
int daemon(int nochdir, int noclose)
{
switch (fork())
{
case 0:break;
case -1: return -1;
default: _exit(0); /* 原进程退出 */
}
if (setsid() < 0) /* 不应该失败 */
return -1;
/* 如果你希望将来获得一个控制tty,则排除(dyke)以下的switch语句 */
/* -- 正常情况不建议用于守护程序 */
switch (fork())
{
case 0:break;
case -1: return -1;
default: _exit(0);
}
if (!nochdir)
chdir("/");
if (!noclose)
{
closeall(0);
open("/dev/null",O_RDWR);
dup(0); dup(0);
}
return 0;
}
/* fork2() -- 类似fork函数,但子进程立刻变成孤儿进程
* (当它退出时不产生僵死进程)
* 返回1给父进程,不是任何有意义的进程号.
* 父进程不能使用wait函数等待子进程结束 (它们是无关的).
*/
/* 这个版本假设你没有捕获和忽略SIGCHLD信号. */
/* 如果你有设定,则不管怎样应使用fork函数 */
int fork2()
{
pid_t pid;
int rc;
int status;
if (!(pid = fork()))
{
switch (fork())
{
case 0:return 0;
case -1: _exit(errno); /* 假设错误码都小于256 */
default: _exit(0);
}
}
if (pid < 0 || waitpid(pid,&status,0) < 0)
return -1;
if (WIFEXITED(status))
if (WEXITSTATUS(status) == 0)
return 1;
else
errno = WEXITSTATUS(status);
else
errno = EINTR;/* 唉,类似这个 :-) */
return -1;
}
分享到:
相关推荐
主要介绍了C语言编写Linux守护进程实例,本文讲解了守护进程及其特性、守护进程的编程要点、守护进程代码实例等内容,需要的朋友可以参考下
利用网上下载的这段代码,成功实现了守护进程,原来守护进程是很简单的事情。
用C语言链表实现进程转换,阻塞变就绪,就绪变执行,执行变阻塞三种状态的转换
用c语言写的demo,jni打包成so包经过测试360绝对杀不死可以试下例子.
此程序具有三个功能:1:读取当前正在运行的进程列表,并获得进程的数量。2:指定欲删除进程进程的pid,删除进程。... 全部在C语言下完成,控制台程序,这里只有代码,下载后在VC++6.0下直接编译执行。
国外留学生的lab,用c语言实现的进程死锁算法,实现了进程死锁的环路检测,并且使用资源分配算法避免死锁,适用于自学,搭配博客使用,附带测试用例。
C语言编写Socket编写进程间传文件,服务器端和客户端传文件.
用c语言模拟进程管理 1、首先构建进程的数据结构 2、实现建立进程 3、三种基本状态的队列 4、将进程入队 5、实现进程在队列之间的转换 6、进程通信
用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码用C语言写的五子棋游戏代码...
C语言实现:短进程优先-进程调度算法 1. 采用“短进程优先”调度算法对五个进程进行调度。每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已用CPU时间、进程...
C语言实现的进程启动监控器
Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命 令.那么操作系统是怎么实现多用户的环境呢?在现代的操作系统里面,都有程序和进程的...本文为大家介绍Linux系统下C语言编程--进程的创建。
c语言写的银行管理系统 c语言写的银行管理系统 c语言写的银行管理系统 c语言写的银行管理系统
运行在linux下的进程监控器软件,只有一页的源代码,自己编写用来提高水平的,轻拍...
对Linux下C语言编程--进程通信、消息管理作了详细的解答
进程监控 进程守护 linux C语言 j进程重启 进程管理 利用linux C语言编写,读取配置文件里面要求启动的程序,并进行实时监控,若进程异常退出,就重新启动 主要功能: 1.读取配置文件程序 2.启动进程 3.监控进程,...
c语言__多进程和多线程
html转C语言字串或数组工具,还可以转图片。是C语言开发网页的好助手。
纯C语言写的hex转bin小工具
用C语言写的旋转方阵,我的旋转方阵是逆时针的,用递归写的