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

 

会话

会话是多个进程组的集合,发起会话的进程不能是某个进程组的组长,否则会出错

 

信号

 

当某个信号出现时,内核有三种方式去处理信号:

(1)忽略此信号,但是有两种信号是绝对不能忽略的,SIGKILLSIGSTOP

(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所指向内存空间,arrNULL时为默认属性,start_rtn是线程开始运行的地方,arg是向start_rtn输入的参数

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。