【1】如何避免僵尸进程
1.资源回收
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:阻塞等待资源的回收
参数:status 保存进程退出的状态
如果传NULL,代表不关心进程的退出状态
返回值:成功返回进程号,失败返回-1
pid_t waitpid(pid_t pid, int *status, int options);
功能:资源的回收
参数:pid
常用: > 0 等待指定的pid进程结束
= -1 等待任意子进程的退出
不常用:= 0 等待其组ID等于调用进程组ID的任意一子进程
< -1 等待其组ID等于|pid|的任意一子进程
status: 保存进程退出的状态
options:标识如何等待进程的退出
0 阻塞等待
WNOHANG 不阻塞
wait(NULL) == waitpid(-1,NULL,0)
2.让它变为孤儿进程
父进程-》bash
孤儿进程-》init
【2】守护进程
1.创建子进程,父进程退出;
fork();
2.在子进程中创建新会话
setsid();
3.改变当前目录为根目录
chdir();
4.重设文件权限掩码
umask();
5.关闭文件描述符
。。。。。。。
【3】线程的概念
为了提高系统的性能,许多操作系统引入了轻量级进程的概念,称为线程
由于进程的地址空间是私有的,因此在进程间上下文切换,系统开销比较大
线程是共享进程的地址空间的,因此上下文切换,系统开销比较小
内核对进程和线程的调度是一样的
线程既有共享资源,又有私有资源
【4】线程的相关操作
创建线程
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:(回调函数)创建一个线程
参数:thread 用来存线程的标识
attr 线程的属性,一般用NULL,系统默认给填
start_routine 函数指针,线程函数,
arg 给线程函数传参
返回值:成功返回0 失败返回错误码
Compile and link with -pthread.
删除线程
#include <pthread.h>
void pthread_exit(void *retval);
功能:线程的退出
参数:retval 线程退出的状态
Compile and link with -pthread.
线程阻塞函数
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:阻塞等待指定线程的退出,回收其资源
参数:thread 线程标识
retval 线程的退出状态
返回值:成功返回0 失败返回错误码
Compile and link with -pthread.
【5】线程的控制:对临界资源的控制
线程间同步与互斥
信号量:实现同步
互斥锁:实现互斥
【6】互斥锁:通过对临界资源进行加锁来实现互斥
目的:来保证共享数据操作的完整性
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
功能:互斥锁的初始化
参数:mutex 锁的标识
attr 锁的属性,一般用NULL
返回值:成功返回0 失败返回错误码
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:阻塞等待上锁,直到上锁成功
参数:mutex 锁的标识
返回值:成功返回0 失败返回错误码
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:解锁
参数:mutex 锁的标识
返回值:成功返回0 失败返回错误码
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:销毁锁
参数:mutex 锁的标识
返回值:成功返回0 失败返回错误码
【7】信号量:实现同步
信号量代表一类资源,其值表示系统中该资源的数量
信号量是一个受保护的变量,只能通过三种操作来访问
初始化
p操作(申请资源)
v操作(释放资源)
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化信号量
参数:sem 信号量的标识
pshared: 0 线程与线程之间
非0 进程与进程之间
value 要初始化的信号量的值
返回值:成功0 失败返回-1
Link with -pthread
#include <semaphore.h>
int sem_wait(sem_t *sem);
功能:申请资源(p操作),申请一次,只能申请一个,如果没有资源,它会阻塞等待
参数:sem 信号量的标识
返回值:成功0 失败返回-1
int sem_post(sem_t *sem);
功能:释放资源(v操作)
参数:sem 信号量的标识
返回值:成功0 失败返回-1
int sem_destroy(sem_t *sem);
功能:信号量的销毁
参数:sem 信号量的标识
返回值:成功0 失败返回-1