Linux系统编程(4)

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. 使用互斥锁实现线程同步

执行结果:

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/91127216
今日推荐