linux系统编程--守护进程

1特点

  • 后台(不与要进行交互)服务进程
  • 独立于控制终端
  • 周期性执行某任务
  • 不受用户登陆注销影响
  • 一般采用以d结尾的名字(服务)

2进程组

  • 进程组的组长
    • 组里边的第一进程
    • 进程组的ID==组长的id
      在这里插入图片描述

3会话-多个进程组之间的通信

  • 创建一个会话注意事项
    • 不能是该进程的组长
    • 创建会话的进程成为新进程组的组长(因为创建会话,系统会建立一个组 然后把需要会话的进程拉进新的进程组,而创建会话的进程是组长以及会长)
    • 创建会话是要root权限
    • 创建出新的会话会丢弃原有的控制终端
    • 一般步骤:先fork,父亲先死,儿子执行创建会话操作(setsid)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
int main(){
	//创建一个会话
	//将子进程编程会长	
	pid_t pid=fork();
	if(pid>0){
		//四种杀死自己的方式
		exit(1);
		//kill(getpid(),SIGKILL);
		//raise(SIGKILL);
		//abort();
	}
	else if(pid=0){
		//变成会长 会长就是一个守护进程
		setsid();
		while(1);

	} 

return 1;
}

4 创建守护进程模型

  • fork子进程,父进程退出
  • 子进程创建新会话setsid()
  • 改变当前工作目录chdir
  • 重设文件掩码–不是必须的
    • 子进程会继承父进程的掩码
    • 增加子进程程序操作的灵活性
    • umask(0);
  • 关闭文件描述符–不是必须的
    • 释放资源close(1)close(2)close(3)
  • 执行核心工作–必须要有的

5练习写一个守护进程每隔2s获取一次系统时间,将这个时间写入磁盘文件

  • 1:创建守护进程
  • 2:需要一个定时器 2s触发一次
    • settimer/sleep
  • 3:信号捕捉
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
#include<sys/time.h>
#include<time.h>
void dowork(int no){
	time_t curtime;
	//得到当前系统时间
	time(&curtime);
	//格式化文件 将时间转化为字符串类型
	char *pt=ctime(&curtime);
	//将时间写入文件
	int fd=open("/home/kiosk/linuxsys/student2/系统编程/temp+++.txt",O_CREAT|O_APPEND|O_WRONLY,0664);
	write(fd,pt,strlen(pt)+1);
	close(1);
}
int main(){
	//创建一个会话
	//将子进程编程会长	 
	pid_t pid=fork();
	if(pid>0){
		exit(1);
	}
	else if(pid=0){
		//变成会长 会长就是一个守护进程并脱离了控制终端
		setsid();
		//改变进程的工作目录
		chdir("/home/kiosk/linuxsys/student2/系统编程");
		//重置文件掩码
		umask(0);
		//关闭文件描述符
		close(STDIN_FILENO);
		close(STDOUT_FILENO);
		close(STDERR_FILENO);
		//执行核心操作
		//注册信号捕捉
		struct sigaction  act;
		act.sa_handler=dowork;
		act.sa_flags=0;
		sigemptyset(&act.sa_mask);
		sigaction(SIGALRM,&act,NULL);
		//创建定时器
		//第一次触发的时间
		struct itimerval val;
		val.it_value.tv_usec=0;
		val.it_value.tv_sec=2;	
		//循化周期
		val.it_interval.tv_usec=0;
		val.it_interval.tv_sec=1;
		setitimer(ITIMER_REAL,&val,NULL);//ITIMER_REAL会发出SIGALRM信号
		
	
		while(1);

	} 

return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值