摘要:进程相关知识点
进程有三种类型:①交互进程,②批处理进程,③守护进程
交互进程:和终端相关,可以在前台进行,也可以在后台运行,关闭终端,进程结束。
批处理进程:跟终端无关,可以将指定的进程放在一个工作队列中按照顺序执行,一般由系统管理。
守护进程:与终端无关,并且在后台一直某些事件或者等待某些事件响应。列如,我们电脑上插入U盘时,电脑会立即识别,识别U盘这个程序我们并没有做任何操作,它是一直在后台运行着的,这便是守护进程。
今天我要讲的便是如何创建一个守护进程,守护进程创建一般有六个步骤,分别是:
1)创建进程(fork()函数),父进程退出(exit( )函数)让子进程变为孤儿进程,让其转到后台运行;
2)让子进程脱离原本会话(setsid()函数)(意思是即使关闭终端也可以执行);
3)修改当前工作路径(chdir()函数,这一步非必要,但建议也执行);
4)重设文件权限掩码(umask(0) 函数 “0”代表原本权限是多少就是多少,这一步也是非必要,但建议也执行)
5)删除进程中所有文件描述符(getdtablesize()函数 返回的是最高的文件描述符,可用循环删除),为了让守护进程更加稳定。
6)用while(1)循环执行子进程。
今天我给大家演示的是守护进程的创建,例子为:创建一个守护进程,每隔一秒记录当前时间到time.log当中。代码如下
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>
int main(int argc, char *argv[])
{
pid_t pid = fork(); //创建子进程
if(pid<0) //判断子进程是否创建成功
{
perror("fork");
exit(0);
}
if(pid>0) //父进程
{
exit(0);//退出父进程,让子进程变为孤儿进程。
}
else //子进程
{
setsid(); //让子进程脱离原本会话
*/ chdir("/tmp"); //修改当前工作路径
umask(0); // 重设文件权限掩码
当然,修改完路径之后对应的日志文件也要拿到/tmp下面去,不然进程找不到文件,
我这里只做个示范,就不修改路径了,直接在当前路径执行。
*/
int i =0;
for(i=0;i<getdtablesize();i++) //删除进程中所有的文件描述符
{
close(i);
}
FILE *fp = fopen("time.log","a+"); //打开日志文件
if(fp==NULL)
{
perror("fopen");
exit(0);
}
while(1) //循环写入当前时间
{
time_t my_t;
time(&my_t); //获取当前时间(秒数)
struct tm *t = localtime(&my_t); //调用函数获取当前时间(年月日时分秒)
int num[6]={t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec};//时间装入数组
fprintf(fp,"%2d年 %2d月 %2d日 %02d:%02d:%02d\n",num[0],num[1],num[2],num[3],num[4],num[5]);//写入日志文件
sleep(1); //每隔一秒写入一次
}
}
return 0;
}
运行结果:
即使关闭了终端,子进程也在运行着,可以通过ps -ef命令看进程状态;
今天的分享到此结束了,作者也是新手 哪里不对的地方欢迎大家多多指正,也感谢各位姥爷的观看。