菜单

manbetx网页手机登录版Linux 的历程组、会话、守护进程

2019年6月15日 - UNIXSolaris

一、进程组ID

种种进度都属于一个进度组。每一个进程组有贰个为首进度。进程组是贰个或多少个进度的集中,平时它们与一组作业相关联,能够承受来自同一终端的各类功率信号。各个进程组都有唯一的长河组ID(整数,也得以存放在pid_t类型中)。进程组由进度组ID来唯一标志。除了进度号外(PID)之外,过程组ID也是三个进程的必不可缺属性之一。

getpgrp: 获得进程组 id, 即领头进程的 pid
#include <unistd.h>
pid_t getpgrp(void);
//重回值;调用进度的历程组ID

#include<unistd.h>
pid_t getpgid(pid_t pid);
//若成功重临进程组id,失败则赶回-1.

种种进程组都有二个老董进度,主管进度的进度号等于进度组ID。老总进度能够成立三个经过组、创立该组中的进度。只要某些进度组中有二个历程存在,则该进度组就存在,与老板进度是或不是终止毫不相关。从进程组成立起来到当中最后多个经过离开截至的光阴距离形成进度组的生存期。进度组中最后三个历程能够告一段落也许改动成另三个进度组中。
展现子进度和父进度的组id

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid;

    if ((pid=fork())<0) {
        printf(“fork error!”);
    }else if (pid==0) {
        printf(“The child process PID is %d.\n”,getpid());
        printf(“The Group ID is %d.\n”,getpgrp());
        printf(“The Group ID is %d.\n”,getpgid(0));
        printf(“The Group ID is %d.\n”,getpgid(getpid()));
        exit(0);
    }

    sleep(3);
    printf(“The parent process PID is %d.\n”,getpid());
    printf(“The Group ID is %d.\n”,getpgrp());

    return 0;
}

程序实施的结果:

manbetx网页手机登录版 1

二、会话
对话是三个或两个经过组的汇聚。举例:

manbetx网页手机登录版 2

#include<unistd.h>
pid_t setsid(void);
假使调用此函数的历程不是一个进程组的老板,则此函数就能够创制叁个新的对话,结果发生三件事:
1、该进程变成新会话的首经过。此时,该进程是新会话中天下无双的长河。
2、该进程成为多个历程组的高管进度。新的历程组ID正是调用进度的ID。
3、该进程未有调节终端。假设在调用setsid从前该进度有三个决定终端,那么这种关联也会断掉。
假使该进程已经是多个历程组的老董,则此函数重临错误。为了确定保障不会发生这种事情,日常先调用fork,然后使其父进度终止,而子进程则再而三。因为子进度继续了父进度的组ID,而其ID是新分配,两个不恐怕约等于,所以就保障了子进度不会是一个进程经理。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid;

    if ((pid=fork())<0) {
        printf(“fork error!”);
        exit(1);
    }else if (pid==0) {
        printf(“The child process PID is %d.\n”,getpid());
        printf(“The Group ID of child is %d.\n”,getpgid(0));
        printf(“The Session ID of child is %d.\n”,getsid(0));
        sleep(10);
        setsid(); //
子进程非经理进度,故其形成新会话首经过,且成为老董进度。该进程组id即为会话进程
        printf(“Changed:\n”);
        printf(“The child process PID is %d.\n”,getpid());
        printf(“The Group ID of child is %d.\n”,getpgid(0));
        printf(“The Session ID of child is %d.\n”,getsid(0));
        sleep(20);
        exit(0);
    }

程序实践的结果:

manbetx网页手机登录版 3

三、守护进度
在linux大概unix系统中在系统的教导的时候会张开多数劳动,那一个劳动就叫做守护进度。为了充实灵活性,root能够选拔系统开启的方式,那一个方式叫做运转等第,每一样运转等第以一定的法子布署种类。
守护进程是脱离于极端并且在后台运维的历程。守护进度脱离于极端是为着防止进度在进行进度中的新闻在其余极端上显得并且经过也不会被其它极端所发出的终端消息所打断。

守护进程编制程序步骤
  1. 成立子进度,父进度退出
    •全体专业在子进程中张开
    •格局上退出了调节终端
  2. 在子进程中创立新会话
    •setsid()函数
    •使子进度完全部独用立出来,脱离调控
  3. 改变当前目录为根目录
    •chdir()函数
    •幸免占用可卸载的文件系统
    •也能够换到别的路子
  4. 重设文件权限掩码
    •umask()函数
    •制止继承的文件创造屏蔽字拒绝有个别权柄
    •扩大照顾进度灵活性
  5. 停息文件讲述符
    •承接的展开文件不会用到,浪费系统财富,不大概卸载
    •getdtablesize()
    •重返所在进度的文本讲述符表的项数,即该进程张开的公文数量

manbetx网页手机登录版 4

该实例首先创制了贰个医生和护士进度,然后让该照管进度各类10s在/tmp/dameon.log中写入一句话。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
       
#define MAXFILE 65535
int main()
{
 pid_t pc;
 int i,fd,len;
 char *buf=”This is a Dameon\n”;
 len =strlen(buf);
 pc=fork();
 if(pc<0){
  printf(“error fork\n”);
  exit(1);
 }else if(pc>0)
 exit(0);
 setsid();
 chdir(“/”);
 umask(0);
 for(i=0;i<MAXFILE;i++)
  close(i);
 while(1){
 
if((fd=open(“/tmp/dameon.log”,O_CREAT|O_WRONLY|O_APPEND,0600))<0){
   perror(“open”);
   exit(1);
   }
  write(fd, buf, len+1);
  close(fd);
  sleep(10);
 }
}

咱俩得以看出程序每一种10s就在相应的文件中写入内容。

manbetx网页手机登录版 5

本文永世更新链接地址http://www.linuxidc.com/Linux/2015-04/115764.htm

manbetx网页手机登录版 6

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图