APUE学习笔记-孤儿进程组kill、signal、fflush、getXXid

本文深入探讨了孤儿进程组的概念,详细解释了 getpid()、getppid()、getpgrp() 和 tcgetpgrp() 函数的作用,并介绍了如何通过 signal 函数和 kill 函数进行信号处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "myapue.h"
#include <errno.h>

static void sig_hup(int signo)
{
	printf("SIGHUP received, pid = %ld\n", (long)getpid());
}

static void pr_ids(char *name)
{
	printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n",\
		name, (long)getpid(), (long)getppid(), (long)getpgrp(),\
		(long)tcgetpgrp(STDIN_FILENO));
	fflush(stdout);
}

int main(void)
{
	char c;
	pid_t pid;	

	pr_ids("parent");
	if((pid = fork()) < 0)
		err_sys("fork error");
	else if(pid > 0){
		sleep(5);
	}
	else{
		pr_ids("child");
		signal(SIGHUP, sig_hup);
		kill(getpid(), SIGTSTP);//向子进程自己发出挂起信号,stop ourself
		pr_ids("child");
		if(read(STDIN_FILENO, &c, 1) != 1)
			printf("read error %d on controlling TTY\n", errno);
	}
	exit(0);
}

<245>9.10孤儿进程组

(1)

getpid():返回调用进程的进程ID。

getppid():返回调用进程的父进程ID。

getpgrp():返回调用进程的进程组ID。(同一进程组中的各个进程接收来自同一终端的各种信号)

tcgetpgrp(int fd):若成功,返回前台进程组ID。它与在fd上打开的终端相关联。

前台进程组:终端设备驱动程序将终端输入和终端产生的信号发送到此处。

fflush(FILE *fp):强制冲洗一个流,使该流所有未写的数据都被传送至内核。

<118>若fp为NULL,则所有输出流被冲洗。

stdout:标准I/O常量,定义在头文件<stdio.h>中。

STDIN_FILENO:标准输入的文件描述符。

(2)

signal函数<256>:此函数是UNIX信号机制最简单的接口。用于建立信号处理程序。

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

signum参数是信号名

    SIGHUP:(挂断信号)终端接口检测到一个连接断开,则将此信号送给与该终端相关的控制进程(会话首进程)。

    (此处,在父进程终止后,进程组包含一个停止的进程,进程组成为孤儿进程组,POSIX.1要求向新孤儿进程组中处于停止状态的每一个进程发送挂断信号)

handler:当接到此信号后要调用的函数的地址。或为常量SIG_IGNSIG_DFL

(3)<267>

kill函数:将信号发送给进程或进程组。

    SIGTSTP:(此处将停止子进程)交互停止信号,当用户在终端上按挂起键时,终端驱动程序产生此信号。该信号发送至前台进程组中的所有进程。

(4)

孤儿进程:父进程已终止的进程,由init进程(进程ID为1)“收养”。

孤儿进程组:<245>

(5)

父进程终止时,子进程变成后台进程组,因为父进程由shell作为前台作业执行。当后台进程组试图读控制终端时,对该后台进程组产生SIGTTIN。

转载于:https://my.oschina.net/u/2463708/blog/509951

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值