APUE第九章笔记

1.进程组

/*********************************************************
包含头文件:  #include <unistd.h>
函数原型:   pid_t getpgrp(void);
函数说明:   同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID.
返回值:    调用进程的进程组ID
*******************************************************/

/********************************************************
包含头文件:  #include <unistd.h>
函数原型:   pid_t getpgid(pid_t pid);
函数说明:   返回进程pid的进程组ID
返回值:若成功,返回进程组ID,若失败,返回-1
注:若pid为0,则返回调用进程的进程组ID
**********************************************************/

vi 9.1.c

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

int main()
{

    printf("进程ID: %d\n",getpid());

    printf("进程组ID:  %d\n",getpgrp());

    printf("init 进程组ID: %d\n",getpgid(1));
    return 0;
}

这里写图片描述

/******************************************************
每一个进程组有一个组长进程,组长进程的进程组ID等于其进程ID
某个进程组有一个进程存在,该进程组就存在,进程组的最后一个进程可以终止也可以转移至其他进程组
包含头文件:  #include <unistd.h>
函数原型:   int setpgid(pid_t pid,pid_t pgid);
函数说明:   加入或创建一个进程组
返回值:若成功,返回0,若出错,返回-1
*****************************************************/

vi 9.2.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{

    pid_t pid;

    if ((pid = fork()) < 0)
    {
    printf("fork error\n");
    exit(0);
    }
    else if (pid == 0)
    {
       printf("in child\n");

       printf("进程ID:  %d\n",getpid());
       printf("进程组ID:  %d\n",getpgrp());
       if (setpgid(getpid(),getpid()) < 0)
       {
       printf("setpgid error\n");
       exit(0);
       }
       printf("修改后....\n");     
       printf("进程ID:  %d\n",getpid());
       printf("进程组ID:  %d\n",getpgrp());
       exit(0);
    }
    if (wait(NULL) != pid)
    {
    printf("wait error\n");
    exit(0);
    }
    printf("in  parent\n");

    printf("进程ID:  %d\n",getpid());
    printf("进程组ID:  %d\n",getpgrp());
    return 0;
}

这里写图片描述

2.会话

/***********************************************************
包含头文件:  #include <unistd.h>
函数原型:   pid_t setsid(void);
函数说明: (1):该进程变成新会话的会话首进程,会话首进程是创建该会话的进程,此时,该进程是会话的首进程
(2):该进程成为一个新进程的组长进程,新进程组ID就是调用进程ID
(3:如果该进程没用控制终端.如果该进程在调用setsid之前该进程有控制终端,那么这种联系也会被切断
返回值:若成功,返回进程组ID,若出错,返回-1
总结: 如果调用进程的进程ID和进程组ID相同,则setsid会失败,子进程默认继承父进程的进程组ID和会话首进程进程组ID
********************************************************/

/****************************************************
包含头文件:  #include <unistd.h>
函数原型:   pid_t  getsid(pid_t pid);
函数说明:返回调用者会话进程pid的会话首进程ID的进程组ID
返回值:若成功,返回会话首进程的进程组ID,若出错,返回-1
*****************************************************/

vi 9.3.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    printf("in parent\n"); 

    pid_t sid;
    pid_t pgid;
    pid_t pid;

    if ((pid = fork()) < 0)
    {
    printf("fork error\n");
    exit(0);
    }
    else if (pid == 0)
    {

    printf("in child\n");
    printf("进程ID:     %d\n",getpid());
    printf("进程组ID:   %d\n",getpgrp());
    pid_t ge;

    if ((ge = getsid(0)) < 0)
    {
        printf("getsid error\n");
        exit(0);
    }
    printf("会话首进程进程组ID: %d\n",ge);
    if ((pgid = setsid()) < 0)
    {
        printf("setsid error\n");
        exit(0);
    }
    pid_t get;

    if ((get = getsid(0)) < 0)
    {
        printf("getsid error\n");
        exit(0);
    }

    printf("会话首进程的进程组ID:  %d\n",get);
    printf("进程组ID:  %d\n",getpgrp());
    exit(0);
    }

    printf("进程ID:  %d\n",getpid());


    if ((sid = getsid(0)) < 0)
    {
    printf("getsid error\n");
    exit(0);
    }
    printf("进程组ID:  %d\n",getpgrp());    
    printf("会话首进程进程组ID:  %d\n",sid);
    return 0;
}

这里写图片描述

/**********************************************************
包含头文件:  #include <unistd.h>
函数原型:   pid_t tcgetpgrp(int fd);
函数说明: 返回前台进程组ID,它与在fd上打开的终端相关联
返回值:若成功,返回前台进程组ID,若出错,返回-1
*********************************************************/

/*******************************************************
包含头文件:  #include <unistd.h>
函数原型:   int tcsetpgrp(int fd,pid_t pgrpid);
函数说明:如果进程有一个控制终端,则该进程可以调用
tcsetpgrp将前台进程组ID设置为pgrpid,pgrpid值应当是同一会话中的一个进程组ID,fd必须引用该会话的控制终端
*******************************************************/

/******************************************************
包含头文件:  #include <termios.h>
函数原型:   pid_t tcgetsid(int fd);
函数说明:    获得会话首进程的进程组ID
返回值:    若成功,返回会话首进程的进程组ID,若出错,返回-1
******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{

    pid_t pid;

    if ((pid = tcgetpgrp(STDOUT_FILENO)) < 0)
    {
    printf("tcgetpgrp error\n");
    exit(0);
    }

    printf("进程ID:  %d\n",getpid());

    printf("标准输出流前台进程组ID : %d\n",pid);

    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值