c/c++:守护进程、线程、线程之间共享和非共享资源、线程常用函数

目录

一、 守护进程

1.1 进程组

1.2 会话

1.3 创建守护进程的步骤

二、线程

 2.1 线程之间共享和非共享资源

2.2 创建线程 pthread_create

2.3 获取当前线程的线程ID   pthread_self

2.4 线程退出  pthread_exit

2.5 回收子线程资源    pthread_join

2.6 线程分离   pthread_detach

2.7 线程取消   pthread_cancel

2.8 比较线程ID是否相同  pthread_equal


 

 

一、 守护进程

1.1 进程组

  • 多个进程的一个集合。
  • 在linux所有的进程都属于某一个进程组。
  • 当前进程组中的第一个进程, 就是组长
  • 进程组ID和组长的进程ID相同

获取当前进程所在的进程组的组ID
  pid_t getpgrp(void);

获取指定进程所在的进程组的组ID
  pid_t getpgid(pid_t pid);
  	- pid: 指定的进程的PID

将一个进程送到另外的一个进程组,创建一个新的进程组
int setpgid(pid_t pid, pid_t pgid);
  	- pid: 要操作的进程的PID
  	- pgid: 进程组ID

 

1.2 会话

多个进程组的集合.

  // 获取进程所属的会话ID
  #include <unistd.h>
  pid_t getsid(pid_t pid);
  	返回值:
  		成功: 会话ID, 失败: -1
  #include <unistd.h>  
  // 创建一个会话
  // 在哪个进程中调用该函数, 这个进程就会被提升为会话
  //  - 没有任何职务的进程才满足条件, 普通的进程
  //  - 这个普通的进程会脱离原来的操作终端
  pid_t setsid(void);
  •   > - 不能是进程组长
  •   > - 创建会话的进程成为新进程组的组长
  •   > - 创建出的新会话会丢弃原有的控制终端

 

1.3 创建守护进程的步骤

红色为必须步骤

- 1. 父进程创建子进程, 杀死父进程             -> 必须
- 2. 将子进程提升为会话                             -> 必须
        setsid();

- 3. 修改进程的工作目录, 工作目录切换到不能被卸载的目录中: / /home    -> 不是必须
          目的: 防止有些不安全目录被卸载: 
              在U盘总启动一个进程, 把U盘拔了, 进程无法正常运行
           chdir();
- 4. 修改umask掩码    -> 不是必须
        umask();
- 5. 关闭/重定向文件描述符    -> 不是必须
        - 标准输入 -> close(0)
        - 标准输出 -> close(1)
        - 标准错误 -> close(2)
        - 重定向: 设备文件: /dev/null ->int fd = open("/dev/null", O_RDWR);
            dup2(0, fd)
- 6. 核心操作流程              -> 必须

 

例子:写一个守护进程, 每隔2s获取一次系统时间,  将这个时间写入到磁盘文件.

#include <stdio.h>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值