当前位置: 首页 > news >正文

Linux4:线程

守护进程

守护进程的特点

后台服务进程

独立于控制终端

周期性执行某任务

不受用户登录注销影响

一般采用以d结尾的名字(服务)

进程组

进程的组长:

        组里边的第一进程

        进程组的ID==进程中的组长的ID

进程中组长的选择:进程中的第一个进程

进程组ID的设定:进程组的ID就是组长的进程ID

会话

创建一个会话注意事项

不能是进程组长

创建会话的进程成为新进程组的组长

有些lInux版本需要root权限执行此操作

创建出的新会话会丢弃原有的控制终端

一般步骤;fork ,父亲死,儿子执行创建会话操作(setid)

获取进程所属的会话ID:pid_t getsid(pid_t pid);

创建一个会话:pid_t setsid(void);

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>int main()
{pid_t pid;pid = fork();if(pid > 0){kill(getpid(),SIGKILL);//raise(SIGKILL);//exit(1);}else if(pid == 0){setsid();while(1);}return 0;
}
~                                                                                         
~           

创建守护进程模型

fork子进程,父进程退出:必须

子进程创建新会话:必须

改变当前工作目录chdir:非必须

重设文件掩码:非必须,子进程会继承父进程的掩码,增加子进程程序操作的灵活性,umask(0)

关闭文件描述符:非必须

        close(0)
close(1)
close(2)
释放占用资源

执行核心工作:必须

线程的概念

1.主线程和子线程,共享:

  1. .text
  2. .bss
  3. .data
  4. 动态加载区
  5. 环境变量
  6. 命令行参数

-通信:全局变量,堆

不共享,一共五个线程,栈区被平均分成五块

2.在Linux下: 线程就是进程-轻量级进程

对于内核来说,线程就是进程

多进程和多线程的区别:

多进程: 始终共享的资源代码、文件描述符、内存映射区--mmap

多线程:始终共享的资源:堆、全局变量,节省资源

3.安卓线程man page ,命令: sudo apt-get install manpages-posix-dev

4.查看指定线程的LWP号:

线程号和线程ID是有区别的:线程号是给内核看的

查看方式:1.找到程序的进程ID    2. ps -Lf pid

线程的创建

创建线程‐‐pthread_create 

int pthread_create( pthread_t *pthread,                   //线程ID = 无符号长整型                       

                               const pthread_attr_t *attr,          //线程属性,NULL 

                                void *(*start_routine)(void *),    //线程处理函数 

                                void *arg);                                 //线程处理函数

参数: 

pthread:传出参数,线程创建成功之后,会被设置一个合适的值 

attr:默认传NULL

start_routine:子线程的处理函数

arg:回调函数的参数 

返回值: 

        成功:0  

        错误:错误号  //perror不能使用该函数打印错误信息 

主线程先退出,子线程会被强制结束 

验证线程直接共享全局变量 


#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void* myfun(void* argv)
{printf("child pathread id is %ld\n",pthread_self());return 0;
}int main()
{pthread_t pthid;pthread_create(&pthid,NULL,myfun,NULL);printf("parent pathread id is %ld\n",pthread_self());for(int i = 0;i < 5;i++){printf("i = %d\n",i);}sleep(2);return 0;
}

注意:要连接pthread库!! 

要睡眠才能执行子线程,否则父线程退出,子线程自动结束

http://www.dtcms.com/a/282073.html

相关文章:

  • 前端技术之---应用国际化(vue-i18n)
  • UE5多人MOBA+GAS 24、创建属性UI(一)
  • ubuntu24 c++ 自定义目录编译opencv4.12
  • Ubuntu GRUB菜单密码重置教程
  • 电脑安装 Win10 提示无法在当前分区上安装Windows的解决办法
  • WPF+CEF 执行JS报错
  • 从零开始的云计算生活——番外3,LVS+KeepAlived+Nginx高可用实现方案
  • [1-01-01].第43节:常用类 - 比较器类 Comparator接口
  • 【DataWhale】快乐学习大模型 | 202507,Task02笔记
  • Grok 系列大模型:xAI 的智能宇宙探秘
  • web前端用MVP模式搭建项目
  • DNS防护实战:用ipset自动拦截异常解析与群联AI云防护集成
  • 用PyTorch手写透视变换
  • 【unitrix】 6.4 类型化数特征(t_number.rs)
  • Rust 基础大纲
  • AI产品经理面试宝典第27天:AI+农业精准养殖与智能决策相关面试题解答指导
  • 疗愈之手的智慧觉醒:Deepoc具身智能如何重塑按摩机器人的触觉神经
  • mongoDB集群
  • Jmeter+ant+jenkins接口自动化测试框架
  • 汽车功能安全-相关项集成和测试(系统集成测试系统合格性测试)-12
  • LabVIEW液压机智能监控
  • 【游戏引擎之路】登神长阶(十九):3D物理引擎——岁不寒,无以知松柏;事不难,无以知君子
  • WSL2更新后Ubuntu 24.04打不开(终端卡住,没有输出)
  • 模型上下文协议(MCP)的工作流程、安全威胁与未来发展方向
  • 海康线扫相机通过采集卡的取图设置
  • 作业06-文本工单调优
  • UE5 相机后处理材质与动态参数修改
  • 图机器学习(8)——经典监督图嵌入算法
  • (笔记+作业)第五期书生大模型实战营---L1G3000 LMDeploy 高效部署量化实践
  • spring容器的bean是单例还是多例的?线程安全吗?