概述
1. 守护进程概念
2. 创建守护进程正规流程
其中PGID是进程组ID,SID是会话ID。
例:创建守护进程
3. 守护进程练习_代码实现
注:回调函数中open函数的设置权限的参数是或上O_APPEND的,这是追加的意思,后面write函数往文件中写的时候会从结尾处开始写。
执行结果:
4. 线程的概念
注:主线程和子线程不共享栈。一个进程中有5个线程的话,栈区就被平均分为5份。
5. pthread_create线程创建函数
例:
执行结果:主线程先退出了,子线程被强制结束,所以没有输出子线程ID:
让主线程睡2秒再退出:
执行结果:
注:gcc时要加参数 -lpthread,指定库的名字。
6. 循环创建多个子线程和注意事项
例:循环创建5个子线程,并在子线程中打印是第几个子线程和子线程的ID。
执行结果:
可以看到,结果中打印是第几个子线程不对。原因是:i 是局部变量,在主线程的栈中,将 i 的地址作为参数传到子线程中,有可能当前创建出的子线程没有抢到CPU,而是主线程继续向下执行,于是 i 变大了,当刚才那个子线程再抢到CPU时,从地址中取出的值就是变大的 i 了,所以就不对了。
于是我们做出改进,就可得到正确的结果了:
执行结果:
7. 线程函数打印错误信息
如果返回值ret不等于0,说明出错了,用strerror函数可以打印错误信息。
8. pthread_exit函数的使用
pthread_exit函数可使调用它的线程退出,并且对其他线程没有影响。pthread_exit函数有一个传入参数retval,可将错误信息的地址传入。不想传入错误信息时,传入NULL即可。retval指针必须指向全局变量或者堆空间,否则如果指向在该线程中定义的局部变量(在该线程的栈空间中)的话,当该线程退出时,局部变量也就消失了。exit函数是退出进程的函数。
例:主线程退出,对子线程没有影响
执行结果:
例:调用exit函数,进程退出,那么该进程中的所有线程也就都被强制退出了。
执行结果:
9. 使用pthread_join回收子线程资源
例:主线程阻塞等待子线程退出,并打印子线程退出状态。
执行结果:
可以发现打印出来的是随机值,这是因为number是子线程中定义的局部变量,存在子线程的栈中,所以子线程退出后,这个变量也就不存在了,因此打印出的是随机值。
把number换成全局变量就对了:
执行结果:
10. 线程相关函数介绍
注:在执行到系统调用的位置处,线程被杀死。如果里面没有write,printf这种系统调用,线程就不能被杀死。
11. 设置分离属性
例:在创建线程时就设置他的分离属性
12. 线程同步的概念
例:在主线程中创建两个子线程,在两个子线程中分别对同一个全局变量number做加法操作。执行完毕后可以发现,结果不正确,比预期的结果要小。
代码:
执行结果:可以发现小于20000
原因:
13. 线程同步的思想
14. 互斥锁相关的函数
(1)互斥锁类型
(2)互斥锁的使用步骤
(3)互斥锁相关函数
注:初始化互斥锁的函数的第二个参数传NULL。
15. 使用互斥锁实现线程同步
执行结果:
最后
以上就是仁爱镜子为你收集整理的Linux系统编程(4)的全部内容,希望文章能够帮你解决Linux系统编程(4)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复