C++学习笔记39:进程概念
进程的基本概念
- 进程是描述程序执行过程和资源共享的基本单位
- 主要目的:控制和协调程序的执行
进程相关函数
- 用户与组ID函数
- 创建进程:system(),fork(),exec()
- 终止进程:kill()
- 等待进程终止:wait(),waitpid()
进程组
- 定义:由一个或多个相关联的进程组成,目的是为了进行作业控制
- 进程组的主要特征:信号可以发送给进程组中的所有进程,并使该进程组中的所有进程终止,停止,或者继续运行
- 每个进程都属于某个进程组
进程组函数
获取进程组ID:pid_t getpgid(pid_t pid);
设置进程组ID:int setpgid(pid_t pid ,pig_t pgid);
会话(session)
- 会话为一个或多个进程组的集合,包括登录用户的全部活动,并具有一个控制终端
- 登录进程为每个用户创建一个会话,用户登录shell进程成为会话首领,其PID设为会话ID
- 非会话首领进程通过调用setsid()函数创建新会话,并成为首领
进程组函数
- 获取会话ID:pid_t getsid(pid_t pid);
- 设置会话ID:pid_t setsid();
信号(signal):进程通讯机制
- 信号是发送给进程的特殊异步消息
- 当进程接收到信息时立即处理,此时并不需要完成当前函数调用甚至当前代码行
- Linux系统中有多种信号,各具备不同的意义;系统以数字标识不同的信号,程序一般以名称引用之
系统信号
缺省处理逻辑:终止进程,生成内核转储文件
使用kill -l命令可查看操作系统支持的信号列表,不同的系统可能有所不同
进程间发送的信号
- SIGTERM,SIGKILL:终止进程信号,前者是请求(接收信号的进程可以忽略之),后者是强制
- SIGUSR1,SIGUSR2:用户自定义信号,可用于向进程发送命令
信号处理
进程接收到信号后,根据信号配置进行处理
缺省配置:在程序没有处理时,确定信号该如何处理
程序处理信号的方式,按照信号处理例程的函数指针定义一个函数,然后调用
sigaction()函数:设置信号配置
处理信号时的注意事项:
- 信号是异步操作,当处理信号时,主程序非常脆弱
- 信号处理例程应该尽可能的短小,它甚至会被新信号中断
- 尽量不要在信号例程中实施I/O操作,也不要频繁调用系统函数或者库函数
- 在信号处理例程中进行复杂的赋值操作也是危险的,它可能不是原子操作,因而在可能在执行时被中断
- 如果需要赋值,使用sig_atomic_t 类型的全局变量(在Linux中等价于int,即允许整数或指针赋值,更大尺寸数据不允许)
#include <signal.h>//处理信号的头文件
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
sig_atomic_t sigusr1_count = ;
extern "C" {void OnSigUsr1(int signal_number) { ++sigusr1_count; }}
int main()
{
std::cout << "pid:" << (int)getpid() << std::endl;
struct sigaction sa;
memset(&sa, , sizeof(sa));
sa.sa_handler = &OnSigUsr1;
sigaction(SIGUSR1, &sa, NULL);
sleep();//在终端中输入kill -s SIGUSR1 pid,信号计数器将递增
std::cout << "SIGUSR1 counts:" << sigusr1_count << std::endl;
return ;
}
C++学习笔记39:进程概念的更多相关文章
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- JavaScript:学习笔记(2)——基本概念与数据类型
JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- OpenFlow Switch学习笔记(一)——基础概念
OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...
- [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- UVA 10254 - The Priest Mathematician (dp | 汉诺塔 | 找规律 | 大数)
本文出自 http://blog.csdn.net/shuangde800 题目点击打开链接 题意: 汉诺塔游戏请看 百度百科 正常的汉诺塔游戏是只有3个柱子,并且如果有n个圆盘,至少需要2^n- ...
- 14_RHEL7安装mplayer
这里用nux-dextop仓库来配置 Nux Dextop桌面对CentOS和RHEL 6/7可用.它是一个面对CentOS.RHEL.ScientificLinux的含有许多流行的桌面和多媒体相关的 ...
- underscorejs-max学习
2.15 max 2.15.1 语法: _.max(list, [iteratee], [context]) 2.15.2 说明: 返回list中的最小值. list为集合,数组.对象.字符串或arg ...
- 基于jq插件开发及弹窗实例
基于jq的插件开发是什么鬼,$.fn是什么鬼,我在实际工作中也遇到过这个问题,下面就让我们一起来看一看这些都是什么鬼. 首先我们介绍$.fn. $.fn是指jquery的命名空间,加上fn上的方法及属 ...
- MySql存储过程—2、第一个MySql存储过程的建立
看看如何创建一个存储过程.虽然通过命令行可以创建,但基本通过MySQL提供的Query browser来创建. 1.首先我们通过Administrator在test数据库中创建一个简单的表名叫”pro ...
- type和instance
获取对象类型 type(object) >>> test_data = [1, 2, 3] >>> type(test_data) <type 'list'& ...
- d038: 星罗密布
内容: 输出图形 *****$***$$$*$$$$$ 规律是...自己发现吧. 要求输入3,输出上面三行的图形 输入说明: 行数小于40 输出说明: 输入样例: 3 输出样例 : ***** ...
- 构建高可用web站点学习--前言
前言:本人对于提高web站点的访问量等的有很浓厚的兴趣,也学习了将近一年的时间,希望能总结点东西,虽然很多东西都是从书籍和资料中学习的,而不是原创,但是这是我总结的一点感悟和进行的分类吧.而且可能思路 ...
- Solr4.8.0源码分析(2)之Solr的启动(一)
上文写到Solr的启动过程是在SolrDispatchFilter的init()里实现,当Tomcat启动时候会自动调用init(); Solr的启动主要在 this.cores = createCo ...
- 【Maven实战】传递性依赖的问题
在上一篇文章中我们已经介绍了依赖性,这次我们再来介绍下传递依赖的问题,首先我们还是在上篇文章基础之上进行编写. 1.上篇文章中已经建立了一个user-core的模块,现在首先再建立一个user-log ...