Unix环境高级编程学习笔记(六):进程关系 信号
进程关系
1 getpgrp函数
#include<unistd.h> pid_t getpgrp(void); 得到本进程所在进程组的pid pid_t getpgrp(pid_t pid); 得到pid所在进程组id
每个进程都属于一个进程组,这个进程组中有一个组长进程,该进程组id等于该组长id,
进程组是否终止与组长进程无关,只要还有一个进程存在,该进程组就存在
pid_t setpgid(pid_t pid, pid_t pgid)
pid指定组长进程,若为0,则调用该函数的进程为组长,
pgid指定进程组id,若为0,则进程组id为组长id
2 会话
会话是多个进程组的集合,发起会话的进程不能是某个进程组的组长,否则会出错
信号
1 当某个信号出现时,内核有三种方式去处理信号:
(1)忽略此信号,但是有两种信号是绝对不能忽略的,SIGKILL和SIGSTOP
(2)捕捉信号,调用用户的处理函数对信号进行处理
(3)执行系统默认动作,系统对每种信号都有默认动作,大部分默认动作是终止该进程
2 signal 函数
#include<signal.h> signal(int signo, void * fun)
第一个参数是要捕捉的信号,第二个参数是当捕捉到信号时要执行的函数名,
当捕捉到信号时,signal函数调用fun,并把signo作为参数传递给fun
3 signal函数练习
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<signal.h>
static void sig_usr(int signo);
int main()
{
signal(SIGUSR1, sig_usr);
signal(SIGUSR2, sig_usr);
for(;;)
pause();
}
static void sig_usr(int signo)
{
if(signo== SIGUSR1)
printf("recieved signal1\n");
if(signo == SIGUSR2)
{
printf("recieved signal2\n");
}
}
4 kill函数
#include<signal.h> int kill(pid_t pid, int signo)
pid>0,向pid进程发送signo信号
pid==0,向同一进程组所有进程发送signo信号
pid==-1 ,发送给所有发送进程有权限发送的进程
5 alarm函数
#include<unistd.h> unsigned int alarm (unsigned int seconds)
seconds秒后,产生SIGALRM信号
6 pause函数
#include<unistd.h> int pause(void)
挂起进程,直到捕捉到一个信号
线程
1 pthread_create函数
#include<pthread.h> int pthread_create(pthread_t * tidp, const pthread_attr_t * arr, void* start_rtn, void* arg)
新创建的线程id会被设置为tidp所指向内存空间,arr为NULL时为默认属性,start_rtn是线程开始运行的地方,arg是向start_rtn输入的参数
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。