进程组的应用

一、实验1

题目:利用进程扇完成一个小实验。该进程扇有 1 个父进程和 3 个子进程,我们希望达到图 1 中的效果,即将进程 0 (父进程)和进程 1 设置成一组,假设为组 1,将进程 2 和 进程 3 设置成另一个组,假设为组 2. 另外,我们希望进程 0 和进程 2 分别是这两个组的组长。

                                                                 

 

测试代码:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
 
int main(void)
{
    setpgid(getpid(), getpid());
    pid_t group1 = getpgid(getpid());
    pid_t group2;
 
    int i = 0;
    for(; i < 3; ++i)
    {
        pid_t pid = fork();
        if(pid < 0)
        {
            perror("fork error");
            exit(1);
        }
        else if(pid > 0)
        {
            // parent process
            if(i == 0)
                setpgid(pid, group1);
            if(i == 1)
            {
                setpgid(pid, pid);
                group2 = getpgid(pid);
            }
            if(i == 2)
                setpgid(pid, group2);
        }
        else
        {
            // child process
            if(i == 0)
                setpgid(getpid(), group1);
            if(i == 1)
            {
                setpgid(getpid(), getpid());
                group2 = getpgid(getpid());
            }
            if(i == 2)
                setpgid(getpid(), group2);
            break;
        }
    }
    printf("pid:%d, ppid:%d, pgid:%d\n", getpid(), getppid(), getpgid(getpid()));
 
    for(int i = 0; i < 3; ++i)
        wait(0);
 
    return 0;
}

输出结果:

 

二、实验2

题目:利用进程扇完成一个小实验。该进程扇有 1 个父进程和 3 个子进程,我们希望达到图 1 中的效果,即将进程 0 (父进程)和进程 1 设置成一组,假设为组 1,将进程 2 和 进程 3 设置成另一个组,假设为组 2. 另外,我们希望进程 0 和进程 2 分别是这两个组的组长。

                                                                            

测试代码:

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
 
int main() 
{
  int pid, i;
  int group1, group2;
 
  setpgid(getpid(), getpid());
  group1 = getpgid(getpid());
 
  for (i = 0; i < 3; ++i) {
    pid = fork();
    if (pid > 0) {
      // father
      if (i == 0) {
        setpgid(pid, pid);
        group2 = getpgid(pid);
      }   
      else if (i == 1) {
        setpgid(pid, group1);
      }   
      else if (i == 2) {
        setpgid(pid, group2);
      }   
      break;
    }   
    else if (pid == 0) {
      // child
      if (i == 0) {
        setpgid(getpid(), getpid());
        group2 = getpgid(getpid());
      }   
      else if (i == 1) {
        setpgid(getpid(), group1);
      }   
      else if (i == 2) {
        setpgid(getpid(), group2);
      }   
    }   
    else if (pid < 0) {
      perror("fork");
      return -1; 
    }   
  }
 
  printf("进程 %d, pid: %d -> ppid: %d, pgid: [%d]\n", i, getpid(), getppid(), getpgid(getpid()));
  while(1) sleep(1);
  return 0;
}

输出结果:

 

三、参考资料

1. 65-进程组(实验一)

2. 66-进程组(实验二)

3. 进程组和组长进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值