1 守护进程创建
定义:周期性的执行某项任务或等待某个事件发生的进程,它的运行不依赖任何shell
终端,它的生存周期较长,从开机开始运行直到关机结束。
守护进程的创建步骤:
1 创建一个子进程,让父进程退出
fork
2 创建新的会话期
setsid();
3 改变子进程的工作目录
chdir("/")
4 取消文件权限掩码
umask(0);
5 关闭所有文件描述符
getdtablesize
线程相关
定义:线程是一种轻量级的进程,用task_struct来标识它,他没有自己的独立内存空间,
它共享创建它的进程的地址空间。
线程创建
使用第三方线程库提供的API
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
作用:创建一个线程
*thread:指向线程ID的指针
*attr:线程属性,通常给NULL
参数三:指向线程执行函数的函数指针
*arg:传给线程执行函数的入参
返回值:0 成功;非0 失败
int pthread_join(pthread_t thread, void **retval);
作用:阻塞等待线程结束,并回收状态值
thread:线程ID
**retval:指向线程退出状态值的指针
void pthread_exit(void *retval);
作用:线程退出函数
*retval:线程退出状态值
int pthread_cancel(pthread_t thread);
作用:取消线程
thread:线程ID
unubtu=Linux内核+各种工具+桌面管理器+各种库+各种应用程序
多线程的通信 同步 互斥
在一个进程中可以创建多个线程,那么多个线程间会存在数据通信问题,
会存在两个线程相互配合完成一件事情,会存在两个线程对公共资源的竞态访问问题
4.1多线程的数据通信--》使用全局变量
4.2多线程的同步-->无名信号量 sem_t sem;
同步:两个对象按照约定的顺序配合完成一件事情
信号量/灯 二值信号量 0/1
需求:线程A---》hello -->flagA(0/1) 0:不打印 1:打印
线程B--->world--》flagB(0/1) 0
A B配合打印10组hello world
flagA===>sem_t sema;信号量(0/1)--》初始化成1
flagB===>sem_t semb;信号量(0/1)--》初始化成0
P/V操作函数控制sema和semb
P操作:sem_wait(&sema)
含义:sem_wait会检测信号量sema的值是否大于0,若大于0,将sema减一
同时函数返回。若等于0,阻塞当前线程。
V操作:sem_post(&sema)--》非阻塞函数
含义:sem_post只会给检测的信号量sema加1
4.3多线程的互斥
互斥的引入:多个线程可能会使用同一段公共资源,若是同时访问这段公共资源,那么
就会造成多个线程对公共资源的竞争,从而造成访问结果混乱。
如何解决?可以使用互斥锁
1 多个线程能否使用同一个线程执行函数
2 两个线程给线程执行函数传入不同的参数,最后执行结果是否发生混乱?
3 使用互斥锁解决两线程互斥访问公共资源
pthread_mutex_t mutex;//线程互斥锁
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);