Linux下的守护进程
来源:互联网 发布:js表单数据的验证 编辑:程序博客网 时间:2024/06/05 10:51
守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并
且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。
Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd
等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。
Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用
户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统
服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程
(Daemon)。
守护进程的特点有:(1)自成一个会话,即会话id是守护进程的pid,SID==PID
(2)自成一个进程组,即组长id是守护进程的pid
(3)在成为守护进程之后,与控制终端失去了联系
凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。守护进程通常采用以d结尾的名字,表示Daemon。
创建守护进程的步骤:
1. 调用umask将文件模式创建屏蔽字设为0
2. 调用fork,父进程退出(exit)。原因:1)如果该守护进程是作为一条简单的shell命令
启动的,那么父进程终止使得shell认为该命令已经执行完毕。2)保证子进程不是一个
进程组的组长进程。
3. 调用setsid创建一个新会话。setsid会导致:1)调用进程成为新会话的首进程。 2)调⽤用
进程成为一个进程组的组长进程 。3)调用进程没有控制终端。(再次fork一次,保证
daemon进程,之后不会打开tty设备)
4. 将当前工作目录更改为根目录。
5. 关闭不在需要的文件描述符。
6. 其他:忽略SIGCHLD信号。
下面编程实现守护进程:
(1)fork一次
1 #include<stdio.h> 2 #include<signal.h> 3 #include<unistd.h> 4 #include<stdlib.h> 5 void mydaemon() 6 { 7 umask(0); //设置文件屏蔽字 8 if(fork()>0) //使父进程退出,子进程变成孤儿进程 9 { 10 exit(0); 11 } 12 setsid(); //使子进程自成一个新的会话 13 chdir("/"); //将子进程改为根目录下 14 close(0); 15 close(1); //关闭文件描述符 16 close(2); 17 signal(SIGCHLD,SIG_IGN); 18 } 19 20 int main() 21 { 22 mydaemon(); 23 while(1); 24 }
运行./mydaemon后,进入根目录下使用ps axj命令找到守护进程 mydaemon的PID。
进入根目录下的/proc,/proc将内存中的进程信息以及软硬件信息以文件系统形式呈现出来。
在/proc下找到守护进程的PID,cd PID可以看到守护进程的信息 。
cwd-->/ 表示当前工作目录是根目录。
fd 是守护进程的文件描述符表 ,在这个程序中为空,可以选择不关闭 文件描述符,则fd不为空。
5 void mydaemon() 6 { 7 umask(0); 8 if(fork()>0) 9 { 10 exit(0); 11 } 12 setsid(); 13 // chdir("/"); 14 close(0); 15 // close(1); 16 // close(2); 17 signal(SIGCHLD,SIG_IGN); 18 }将程序进行上述改变,进入守护进程后可以看见 不同的信息 -----5 6
我们也可以直接调用系统提供函数 int daemon (int nochdir, int noclose)
参数有两种形式 (1)缺省:改变
(2)非缺省:不改变
当调用daemon(0,0)时,工作目录为根目录,fd为空(/dev/null中的信息会被丢弃)
当调用daemon(1,1)时,工作目录和文件描述符都不改变
(2)两次fork
#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <sys/stat.h>void creat_daemon(void){int i;int fd0;pid_t pid;struct sigaction sa;umask(0); //设置文件掩码为0if( (pid = fork()) < 0 ){}else if (pid != 0){exit(0); //终止父进程}setsid(); //设置新会话sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if( sigaction(SIGCHLD, &sa, NULL ) < 0 ){ // 注册子进程退出忽略信号return;}if( (pid = fork())<0){ //再次fork,终止父进程,保持子进程不是话首进程,从而保证后续不会在和其他终端关联printf("fork error!\n");return;}else if( pid != 0){exit(0);}if( chdir("/") < 0 ){//更改工作目录到根printf("child dir error\n");return;}close(0);fd0 = open("/dev/null", O_RDWR); // 关闭标准输入,重定向所有标准(输入输出错误)到/dev/nulldup2(fd0, 1);dup2(fd0, 2);}int main(){creat_daemon();while(1){sleep(1);}}
- Linux下的守护进程
- Linux下的守护进程
- linux下的守护进程
- Linux下的守护进程
- Linux下的守护进程
- Linux下的守护进程
- Linux下的守护进程
- Linux下的守护进程
- linux下的守护进程
- linux下的进程之-----守护进程
- Linux下守护进程
- Linux下守护进程
- linux 下守护进程
- Linux下守护进程的创建
- Linux下守护进程的创建
- Linux下守护进程的创建过程
- Linux下守护进程的创建例子
- 认识Linux下的守护进程
- android播放有旋转角度的视频
- Notification通知栏的基本使用
- navicat for mysql 10.0.11简体中文破解版 绿色版
- JDK动态proxy原理解析
- mongodb3.4 Document Validation【文档验证】
- Linux下的守护进程
- C++:用CreateDirectory创建文件目录
- Android 手机休眠,进程仍存在
- LevelDB初探之简单使用 2014-07-28 17:16:18 分类: 大数据 一、简介 LevelDB是google开源的一个key-value存储引擎库,从版本1.2开始就
- nginx 配置后网站图片或js 加载出来一半或者不出来刷新才可以,chrome 浏览器访问项目时加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH:
- 大数据--计算引擎分类
- Java使用Apache POI导出-注意前端不要使用Ajax异步请求
- 删用户删表空间的操作还能flashback回来吗?
- [LeetCode] 404. Sum of Left Leaves