IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> C++笔记--Linux编程(13)-守护进程-线程 -> 正文阅读

[系统运维]C++笔记--Linux编程(13)-守护进程-线程

进程组

?概念和特性

?????????每个进程都属于一个进程组,在waitpid函数和kill函数的参数中都曾使用到。

????????当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID==第一个进程ID(组长继承)。所有,组长进程表示,其进程组ID==其进程ID

? ? ? ? 可以使用kill-SIGKILL-进程组ID来将整个进程组内的进程全部杀死

? ? ? ? 组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程村庄,进程组就存在,与组长进程是否终止无关。

? ? ? ? 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)

? ? ? ? 一个进程可以为自己或子进程设置进程组ID

进程组操作函数(了解)

? ? ? ? getpgrp函数

会话

创建会话

创建一个会话需要注意一下事项:

? ? ? ? 1. 调用进程不能是进程组组长,该进程变成新会话首进程(session header)

? ? ? ? 2. 该进程成为一个新进程组的组长进程

? ? ? ? 3. 新会话丢弃原有的控制终端,该会话没有控制终端

? ? ? ? 4. 该调用进程是组长进程,则出错返回

? ? ? ? 5. 建立新会话时,先调用fork,父进程终止,子进程调用setsid

getsid函数

获取进程所属的会话ID

? ? ? ? pid_t getsid(pid_t pid); 成功,返回调用进程的会话ID;失败 -1,设置errno

? ? ? ? pid为0表示查看当前进程session ID

? ? ? ? ps ajx命令查看系统中的进程,参数a表示不仅当前用户的进程,也列出所有其它用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

pid_t setsid()

????????setsid函数创建一个新会话和一个新进程组,然后守护进程成为新会话的会话领导,以及新进程组的进程组领导。

????????setsid调用还保证新会话没有控制终端。 如果调用进程已经是一个进程组的领导进程,setsid调用失败。

????????setsid调用成功返回新会话ID,失败返回-1,并设置errno。

会话和进程总结

? ? ? ? 会话:进程组的更高一级,多个进程组对应一个会话

? ? ? ? 进程组:多个进程在同一个组,第一个进程默认是进程组的组长

? ? ? ? 创建会话的时候,组长不可创建,必须是组员创建

? ? ? ? 创建会话的步骤:创建子进程,父进程终止,子进程自己当会长

守护进程

创建守护进程模型

? ? ? ? 1. 创建子进程,父进程退出

? ? ? ? ? ? 所有工作在子进程中进行形式上脱离了控制终端

? ? ? ? 2. 在子进程中创建新会话

? ? ? ? ? ? setsid()函数

? ? ? ? ? ? 使子进程完全独立出来,脱离控制

? ? ? ? 3. 改变当前目录为根目录

? ? ? ? ? ? chdir()函数

? ? ? ? ? ? 防止占用可卸载的文件系统,也可以换成其它路径

? ? ? ? 4. 重设文件权限掩码

? ? ? ? ? ? umask()函数

? ? ? ? ? ? 防止继承的文件创建屏蔽拒绝某些权限,增加守护进程灵活性,

? ? ? ? 5. 关闭文件描述符

? ? ? ? ? ? 继承的打开文件不会用到,浪费系统资源,无法卸载

? ? ? ? 6. 开始执行守护进程核心工作

? ? ? ? 7. 守护进程退出处理程序模型

守护进程的步骤:

? ? ? ? 1. 创建子进程fork? ? ??

? ? ? ? 2. 父进程退出

? ? ? ? 3. 子进程当会长 setsid

? ? ? ? 4. 切换工作目录 $HOME

? ? ? ? 5. 设置掩码 umask

? ? ? ? 6. 关闭文件描述符0,1,2 ,为了避免浪费资源

? ? ? ? 7. 执行核心逻辑

? ? ? ? 8. 退出

进程与线程

????????进程是一个实体。每一个进程都有它自己的内存地址段(heap、stack等等)

????????进程是执行中的程序。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体。

????????进程是操作系统中最基本、重要的概念。

????????线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行的最小单元。

????????每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

????????单线程的进程可以简单的认为只有一个线程的进程。

???????? 一个进程在同一时间只做一件事,有了多线程后一个进程同一时间可以做多件事。

????????每个线程可以处理不同的事务。 无论系统有几个CPU,即使进程运行在单CPU上,多线程也可以使进程并发处理多个事务。

????????一个线程阻塞并不会影响到另外一个线程。 多线程的进程可以尽可能的利用系统CPU资源。

????????线程包含了表示进程内执行环境必须的信息,包括标识线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。

???????? 进程内所有的信息对于线程都是共享的,包括执行代码,全局变量,和堆内存,栈以及文件描述符。

线程标识

????????就像每个进程有个进程ID一样,线程也有自己的ID。

????????进程ID用pid_t来表示,它是一个unsigned int。

????????线程ID用pthread_t表示,pthread_t不能把它当整数处理。

????????线程可以通过pthread_self()函数获得自身的线程ID

? ? ? ? ps -Lf pid查看置顶现场的lwp好

线程调用

线程创建

????????在进程中只有一个控制线程 程序开始运行的时候每个进程只有一个线程,它是以单线程方式启动的,在创建多个线程以前,进程的行为与传统的进程没有区别。

????????gcc在链接的时候需要增加-lpthread选项。 创建一个线程调用pthread_create函数。

#include <pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);

????????如果pthread_create成功返回,由thread指向的内存单元被设置为新创建线程的线程ID。

????????attr参数用于定制各种不同的线程属性。

????????新创建的线程从start_rtn函数地址开始执行,该函数只有一个void *参数,如果需要向start_rtn函数传递多个参数,就需要把这些参数放到一个结构中,然后把这个结构的地址做为void *传入。

????????线程创建的时候不能保证哪个先运行。 pthread函数成功返回0。

注意:每个线程都拥有一份errno副本,不同的线程拥有不同的errno

pthread_create示例

void *func(void *arg)
{
	printf("pthread start\n");
	return NULL;
}
int main(int arg, char * args[])
{
	pthread_t thr_d;
	int err = pthread_create(&thr_d, NULL, func, NULL);
	if (err != 0)
	{
		printf("create pthread failed\n");
	}
	else
	{
		printf("create pthread success\n");
	}
	sleep(1);
	return 0;
}

注:gcc链接时需要加-lpthread选项

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:55:18  更:2021-08-08 11:57:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:32:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码