Linux day8

守护进程

会话:进程组的更高一级,多个进程组对应一个会话。
进程组:多个进程在同一个组,第一个进程默认是进程组的组长创建会话的时候,组长不可以创建,必须是组员创建。
创建会话的步骤:创建子进程,父进程去死,子进程自当会长。

守护进程的步骤:

  • 创建子进程fork
  • 父进程退出
  • 子进程当会长 setsid
  • 切换工作目录$hOME
  • 设置掩码 umask
  • 关闭文件描述符0,1,2,为了避免浪费资源
  • 执行核心逻辑
  • 退出

创建一个守护进程:每分钟在$HOME/LOG/创建一个人间 程序名.时间戳
Linux day8
扩展了解:
通过nohup指令也可以达到守护进程创建的效果
nohup cmd[>1.log]&

  • nohup指令会让cmd收不到SIGHUP信号
  • &代表后台运行

线程

线程 man page安装
sudo apt-get install manpages-posix-dev
线程的概念:轻量级的进程,一个进程内部可以有多个线程,默认情况下一个进程只有一个线程
线程是最小的执行单位,进程是最小的系统资源分配单位
内核实现都是通过 clone函数实现的
线程也有自己的PCB

线程的优点:

  • 提高并发性
  • 占用资源小
  • 通信方便

缺点:

  • 调试困难
  • 库函数,不稳定
  • 对信号支持不好

Linux day8

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()
Linux day8

Linux day8
线程id在进程内部是唯一的!
初始化线程属性:
int pthread_attr_init(pthread_attr_t*attr);
销毁线程属性
int pthread_attr_destroy(pthread_attr_t attr);
设置属性分离
int pthread_attr_setdetachstate(pthread_attr_t
attr,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.线程间缺乏必要的同步机制
只能解决第三点