Linux day8
守护进程
会话:进程组的更高一级,多个进程组对应一个会话。
进程组:多个进程在同一个组,第一个进程默认是进程组的组长创建会话的时候,组长不可以创建,必须是组员创建。
创建会话的步骤:创建子进程,父进程去死,子进程自当会长。
守护进程的步骤:
- 创建子进程fork
- 父进程退出
- 子进程当会长 setsid
- 切换工作目录$hOME
- 设置掩码 umask
- 关闭文件描述符0,1,2,为了避免浪费资源
- 执行核心逻辑
- 退出
创建一个守护进程:每分钟在$HOME/LOG/创建一个人间 程序名.时间戳
扩展了解:
通过nohup指令也可以达到守护进程创建的效果
nohup cmd[>1.log]&
- nohup指令会让cmd收不到SIGHUP信号
- &代表后台运行
线程
线程 man page安装
sudo apt-get install manpages-posix-dev
线程的概念:轻量级的进程,一个进程内部可以有多个线程,默认情况下一个进程只有一个线程
线程是最小的执行单位,进程是最小的系统资源分配单位
内核实现都是通过 clone函数实现的
线程也有自己的PCB
线程的优点:
- 提高并发性
- 占用资源小
- 通信方便
缺点:
- 调试困难
- 库函数,不稳定
- 对信号支持不好
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
- thread 线程的id,传出参数
- attr代表县城的属性
- 第三个参数 函数指针,void* func(void*)
- arg线程执行函数的参数
- 返回值
–成功返回0
–失败返回errno
编译的时候需要家pthread库
Compile and link with -pthread
gcc 03_pathread_create.c -lpthread
在家目录的.bashrc增加
alias echomake=‘cat~/bin/makefile.template>>makefile’
设置shell里vi的快捷键
set -o vi
设置后vi的快捷键在shell里都能使用
线程退出函数
pthread_exit
线程退出注意事项:
- 在线程中使用pthread_exit
- 在线程中使用return(主控线程return代表退出进程)
- exit代表退出整个进程
线程回收函数-阻塞等待回收
int pthread_join(pthread_t thread, void **retval);
- thread创建的时候传出的第一个参数
- retval代表的传出线程的退出信息
杀死线程
int pthread_cancel(pthread_t thread);
- 需要出入tid
- 返回值
– 失败返回errno
– 成功返回0
被pthread_cancel杀死的线程,退出状态为PTHREAD_CANCELED
#define PTHREAD_CANCELED((void*)-1)
强行设置取消点
pthread_testcancel()
线程id在进程内部是唯一的!
初始化线程属性:
int pthread_attr_init(pthread_attr_t*attr);
销毁线程属性
int pthread_attr_destroy(pthread_attr_t attr);
设置属性分离
int pthread_attr_setdetachstate(pthread_attr_tattr,int detachstate);
- attr init初始化的属性
- detachstate
– PTHREAD_CREATE_DETACHED线程分离
–PTHREAD_CREATE_JOINABLE允许回收
查看线程库版本
getconf GUN_LIBPHREAD_VERSION
创建多少个线程?
cpu核数*2+2
线程使用注意事项
1.主线程退出其他线程不退出,主线程应调用 pthread exit
2.避免僵尸线程
pthread_join
pthread_detach
pthread_create指定分离属性
被join线程可能在join函数返回前就释放完自己的所有内存资源,所以不应当返回被回收线程枝中的值;
3. malloc和mmap申请的内存可以被其他线程释放
4.应避免在多线程模型中调用fork除非,马上exec,子进程中只有调用fork的线程存在,其他线程在子程中均 pthread_exit
5信号的复杂语义很难和多线程共存,应避在多线程引入信号机制
线程同步:协调步骤,顺序执行
解决同步的问题:加锁
数据混乱的原因:
1.资源共享(独享资源则不会)
2.调度随机(疑问这数据访问会出现竞争)
3.线程间缺乏必要的同步机制
只能解决第三点