1特点
- 后台(不与要进行交互)服务进程
- 独立于控制终端
- 周期性执行某任务
- 不受用户登陆注销影响
- 一般采用以d结尾的名字(服务)
2进程组
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);
}
else if(pid=0){
setsid();
while(1);
}
return 1;
}
4 创建守护进程模型
5练习写一个守护进程每隔2s获取一次系统时间,将这个时间写入磁盘文件
- 1:创建守护进程
- 2:需要一个定时器 2s触发一次
- 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);
while(1);
}
return 1;
}