守护进程
-
daemon进程。通常运行与操作系统后台,脱离控制终端一般不与用户直接交互。周期性的等待某个事件发生或周期性执行某一动作。
-
不受用户登录注销影响。通常采用以d结尾的命名方式。
守护进程的创建步骤
- fork子进程,让父进程终止;
- 子进程调用setsid()创建新会话;
- 通常根据需要,改变工作目录位置chdir(),防止目录被卸载;
- 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限;
- 通常根据需要,关闭/重定向文件描述符;
- 守护进程业务逻辑。while();
线程
线程概念
- 进程:有独立的进程地址空间,有独立的pcb。分配资源的最小单位。
- 线程:有独立的pcb。没有独立的进程地址空间。最小单位的执行。
线程共享
- 独享:栈空间(内核栈、用户栈)
- 共享:共享全局变量
线程控制原语
-
pthread_t pthread_self(void);获取线程id,线程id是在进程地址空间内部,用来标识线程身份的id号。
返回值:本线程id -
int pthread_create(&tid,属性,指针函数名,函数参数);创建子线程
返回值:成功:0,失败:errno -
void pthread_exit(void *retval);退出当前线程
retval:退出值。无退出值时,NULL
exit():退出当前进程return:返回到调用者那里去
-
int pthread_join(pthread_t thread,void ※※retval) ;阻塞,回收线程,线程异常结束,值为-1
thread:待回收的线程id
retval:传出参数。回收的那个线程的退出值。
返回值:成功:0,失败:errno -
int pthread_detach(pthread_t thread);设置线程分离
thread:待分离的线程id
返回值:成功:0,失败:errno -
int pthread_cancel(pthread_t pthread);杀死一个线程,需要到达取消点(保存点)
返回值:成功:0,失败:errno
如果,子线程没有到达取消点,那么pthread_cancel无效。
pthread_testcancel(),手动添加取消点
成功被pthread_cancel()杀死的进程,返回-1,使用pthread_join回收
线程属性
设置属性分离
- pthread_attr_t attr 创建一个线程属性结构体变量
- pthread_attr_init(&attr);初始化线程属性
- pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACH);
- pthread_create(&tid,&attr,函数名,函数参数);借助修改后的设置线程属性,创建线程
- pthread_attr_destroy(&attr);销毁线程属性