一、常用信号:
信号宏名 说明 系统默认处理方式
SIGALRM 超时,调用alarm函数时产生 终止
SIGINT 终止进程(Ctrl+c) 终止
SIGKILL 无条件终止一个进程,不可以被捕获 终止
Kill()函数:
表头文件:
#include<sys/types>
#include<signal.h>
定义函数:int kill(pid_t pid, int sig)
函数说明:kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:
pid>0 将信号传给进程识别码为pid的进程
pid=0 将信号传给和目前进程相同进程组的所有进程
pid=-1 将信号像广播般传送给系统内所有的进程
pid<0 将信号传给进程组识别码为pid绝对值的所有进程
返回值:执行成功返回0;有错则返回-1
程序说明:10秒后重启
程序说明:利用alarm函数来终止进程
二、信号处理的三种方式
(1)忽略
(2)执行用户需要执行的动作(捕获)
(3)默认处理
三、设置信号处理方式
调用signal函数来设置信号的处理方式
四、线程
线程是任务调度和执行的基本单位。
进程实现多任务的缺点:
(1)进程间切换的计算机资源开销很大,切换效率非常低
(2)进程间数据共享的开销也很大
线程和进程的关系:
(1)线程是进程的一个执行单元,是进程内可调度实体,比进程更小的独立运行的基本单位。
(2)同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
(3)进程退出,进程中所有线程全部退出
(4)线程不可能完全替代进程
线程的创建:pthread_create函数
返回值:创建成功返回0;有错误则返回非0值。
线程的退出:
(1)return 0;不会弹栈
(2)主动退出:pthread_cancel函数,需要发生系统调用才能使用该函数。
(3)pthread_exit函数,会弹栈。
注册线程退出函数
pthread_cleanup_push
pthread_cleanup_pop
必须成对出现
线程等待:
目的是为回收次线程或子线程的资源。
线程的状态:
(1)可结合状态;不能被其他进程或线程回收资源,只能通过pthread_join去回收。
(2)分离态;执行完之后,系统会自动回收。
线程和进程的区别:
(1)进程空间天然独立,因此进程间资源的保护是天然的,需要关心的是进程间的通信功能
(2)多线程天然共享进程的空间,因此线程数据共享是天然的,需要关心的是线程的资源保护。
提供线程资源保护的机制:
(1)互斥锁
(2)线程信号量
使用步骤:s1、定义信号量集合,sem_t sem[n],n为常数;
s2、初始化信号量;sem_init(&sem[0],int pshared,unsigned int value)
参数说明:pshared: +0:给线程使用;+ !0:可以给进程使用(一般不使用)
value:初始值,一般为1;
s3、p、v操作;
p操作: 函数原型#include <semaphore.h>
int sem_wait(sem_t *sem)//阻塞P操作
功能:阻塞p操作集合中某个信号量,值-1
v操作:int sem_post(sem_t *sem);
功能:对某个信号进行v操作,v操作不存在阻塞问题。V操作成功后,信号里的值会+1
返回值:成功返回0,失败返回-1
五、条件变量
条件变量的作用:多线程配合工作时,当线程检测到某条件不满足时就休眠,直到别的线程将条件准备好,然后通过条件变量将其唤醒。
条件变量使用步骤:
S1、定义条件变量:pthread_cond_t
S2、初始化: (1)int pthread_cond_init();
(2)定义时直接初始化:pthread_cond_t cond=PTHREAD_COND_INITIALIZER
S3、等待条件的函数: int pthread_cond_wait();
唤醒条件函数:int pthread_cond_signal(pthread_cond_t *cond)