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

#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孤儿进程组shell

(1)函数

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

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

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

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

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

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

<118>若fp为NULL,则全部输出流被冲洗。io

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

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。

相关文章
相关标签/搜索