zl程序教程

您现在的位置是:首页 >  系统

当前栏目

[linux] C语言Linux系统编程-做成守护进程详解编程语言

2023-06-13 09:20:37 时间

必须是init进程的子进程,运行在后台,不与任何控制终端相关联。

通过以下步骤成为守护进程

1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程

2.在新守护进程的父进程中,调用exit(),为了守护进程的爷爷进程确认父进程结束

3.在新守护进程中,调用setsid(),使得该进程有一个新的进程组和新的会话,保证了该进程不与控制终端相关联

4.用chdir()将当前工作目录改为根目录,因为前面fork出来的新进程,当前工作目录可能在文件系统的任何地方

5.关闭所有文件描述符

6.打开 0 1 2号文件描述符(标准输入,标准输出,标准错误),把它们重定向到/dev/null

 

 

#include sys/types.h 

#include sys/stat.h 

#include stdlib.h 

#include stdio.h 

#include fcntl.h 

#include unistd.h 

#include linux/fs.h 

int main(){ 

 int ret; 

 //创建新进程 

 ret=fork(); 

 //创建失败的直接返回 

 if(ret 0){ 

 return -1; 

 //父进程直接结束 

 if(ret 0){ 

 exit(EXIT_SUCCESS); 

 //创建新的进程组和会话 

 ret=setsid(); 

 //失败的直接返回 

 if(ret 0){ 

 return -1; 

 //改变当前工作目录 

 chdir("/"); 

 //关闭所有文件描述符 

 //标准输入输出重定向到/dev/null 

 //NR_FILE 是系统在某一给定时刻,限制的文件总数 

 for(int i=0;i NR_FILE;i++){ 

 close(i); 

 open("/dev/null",O_RDWR); 

 dup(0); 

 dup(0); 

 //下面可以写自己的操作... 

 while(1){ 

 sleep(1); 

 return 0; 

}

 

 

自带函数:daemon();

原型 int daemon(int nochdir,int noclose)

nochdir为0 改为根目录,noclose为0 关闭所有文件描述符

daemon(0,0)

#include sys/types.h 

#include sys/stat.h 

#include stdlib.h 

#include stdio.h 

#include fcntl.h 

#include unistd.h 

#include linux/fs.h 

int main(){ 

 daemon(0,0); 

 //下面可以写自己的操作... 

 while(1){ 

 sleep(1); 

 return 0; 

}

[linux] C语言Linux系统编程-做成守护进程详解编程语言 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12512.html

cjavalinux