进程组、作业、会话
进程之间除了“父子关系”“兄弟关系”这样的亲缘关系之外,还有一种关系称为“在同一个进程组”中。
1、进程组——每个进程除了有一个进程ID之外,还属于一个进程组
(1)一个或多个进程的集合,通常他们与一组作业相关联;
(2)同进程组中的所有进程都可以接受来自同一终端的各种信号;
(3)每个进程组有一个唯一的进程组ID;
(4)每个进程都可以有一个组长进程,其进程组ID等于组长ID;
(5)在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。
2、作业——作业和进程组的概念基本类似,一般情况下不区分二者概念
(1)Shell分前后台来控制的不是进程而是“作业”或者进程组;
(2)一个前台作业可以由多个进程组成,一个后台也可以由多个后台组成;
(3)Shell可以运行一个前台作业和任意多个后台作业。
注意—作业和进程组的区别:如果作业中的某个进程又创建了子进程,则子进程属于进程组,但是不属于作业。
3、会话——是一个或多个进程组的集合,一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。
(1)一个会话对应一个控制终端。通常是登录到其上的终端设备或伪终端设备;
(2)建立与控制终端连接的会话首进程被称为控制进程;
(3)一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。
守护进程
守护进程——也称精灵进程,是运行在后台的一种特殊进程,独立于控制终端并且周期性地执行某种任务或等待处理某些事件的发生。
特点:关掉终端,进程还在。
分类——按照服务类型分为如下几个。
系统守护进程:syslogd、login、crond、at等。
网络守护进程:sendmail、httpd、xinetd、等。
独立启动的守护进程:httpd、named、xinetd等。
被动守护进程(由xinetd启动):telnet、finger、ktalk等。
————***创建步骤:*
(1)创建子进程,让父进程结束,子进程继续执行
(2)子进程调用setsid,创建一个会话
(3)忽略SIGHUP,SIGCHLD
(4)修改工作目录,为根目录
(5)对标准输出和标准错误进行重定向
(6)修改umask
mydeamon.c文件——————
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<fcntl.h>
#include<sys/stat.h>
void MyDeamon()
{
//1、创建子进程,让父进程结束,子进程继续执行
pid_t ret=fork();
if(ret>0){
exit(0);
}
//2、子进程调用setsid,创建一个会话
setsid();
//3、忽略SIGHUP,SIGCHLD
signal(SIGHUP,SIG_IGN);
signal(SIGCHLD,SIG_IGN);
//4、修改工作目录,为根目录
chdir("/");
//5、对标准输出和标准错误进行重定向
int fd=open("/dev/null",O_RDWR);
dup2(fd,1);
dup2(fd,2);
//6、修改umask
umask(0);
}
int main()
{
MyDeamon();
while(1){
sleep(1);
}
return 0;
}
makefile文件——————
mydeamon:mydeamon.c
gcc mydeamon.c -o mydeamon
.PHONY:clean
clean:
rm -f mydeamon
结果图