linux线程信号进程,Linux下的进程与线程(二)—— 信号

Linux进程之间的通信:

本文主要讨论信号问题。

在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程。

然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得以知道的。

Linux系统的进程之间是通过信号来通信的。

程序员在Shell上显式地发送信号使用的是kill命令,原型如下:

kill -sigid [-]pid

其中, sigid指示的是信号的id,pid前若有-,则pid代表的为进程组id,否则pid代表的为进程id

kill函数也有相同的作用,原型如下:

int kill(pid_t pid, int sig);

一个使用kill命令的典型例子如下:

我们在Linux的Shell上运行一个前台作业的时候,Shell会fork一个新的进程A,然后在这个新的进程中运行我们的作业。该前台作业在运行时也可能会fork子进程a,子进程b。

当我们按下Ctrl+C,Shell会收到一个SIGINT信号,然后Shell进程会转发这个信号到A,然后A再将这个信号转发到子进程a,子进程b。

通过这种转发的方式,实现信号传递。

下图摘自CS:APP(图8-27),在本书的举例中,前台作业运行的是 ls | sort,图示一目了然:

0bd41a5de4d737973ecf641a357cd3f1.png

值得一提的是,当父进程创建子进程之后,父子进程的进程组ID(pgid)是相同的。

信号的等待与阻塞:

如果一个进程正在处理类型为k的信号,那么此时当另一个k信号到的时候,进程的pending位向量(待处理信号集)的第k位会被设置。但这个刚到的k信号不会被立即处理,直到handler程序返回。

如果此时又来了一个k信号,那么由于此前pending位向量已被设置,所以这个信号会被丢弃。

一旦进程接收了信号k,那么内核就会清除pending的第k位。

blocked位向量(被阻塞信号集)维护着进程阻塞的信号,在这里设置的信号不会被进程接收处理。

所以我们知道,pending & ~blocked 的结果指示了进程将要去接收处理的信号集。

信号中断慢速系统调用:

诸如read,wait,accept之类的慢速系统调用会阻塞进程,在特定的Solaris系统上,当被阻塞的进程被信号中断之后,将不会再返回。而是给用户一个错误条件,并对errno进行设置。

在Linux系统上,会自动重启被中断的系统调用.

为了使得编写的代码在Linux和Solaris系统上都能运行,需编写可移植性代码.

接收信号:

进程接收每一个信号之后都有默认的行为,比如接收SIGKILL信号后,进程被终止。

可以设置signal函数,来修改部分信号的默认行为:

sighandler_t signal(int signum, sighandler_t handler)

其中,signum为要捕获的信号,handler为捕获信号后要执行的函数名称。

Linux下的进程与线程(一)—— 进程概览

进程是操作系统分配资源的基本单位.线程是操作系统进行运行和调度的基本单位. 进程之间可以切换,以便轮流占用CPU,实现并发.一般进程运行在用户模式下,只能执行指令集中的部分指令. 当进程进行上下文切换 ...

Linux下查看进程和线程

在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

linux下的进程,子进程,线程

1.相同点:(a)二者都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略.(b) 每个进程都有一个进程控制块,线程也拥有一个线程控制块.(c) 线程和子进程共享父进程中的资源:线程和子进程独立 ...

Linux下c开发 之 线程通信(转)

Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

linux下监控进程需掌握的四个命令

linux下监控进程需掌握的四个命令   在LInux系统下,最困难的工作之一就是跟踪正在系统中运行的程序,尤其是现在,图形桌面使用很多的程序,只是为了生成一个桌面环境,系统中运行了太多的进程,幸运的 ...

linux下查看进程的状态 /proc/[pid]/status

查看进程的状态: 1.查看进程的pid,以java为例:ps -ef | grep java 2.查看进程状态:cat /proc/[pid]/status 关键字: linux [root@loca ...

Linux下c开发 之 线程通信

Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

Linux下多任务间通信和同步-信号

Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...

随机推荐

PHP注册与登录【2】用户注册

注册页面 reg.html 负责收集用户填写的注册信息.教程里只列出关键的代码片段,完整的代码附在本节最后. 注册表单

用户注册 ...

nfs部署和优化

nfs--网络文件系统 1.说明:允许一个系统在网络上与他人共享目录和文件 2.好处:通过nfs服务,就可以让这个机器访问远程的文件,像访问自己的文件一样,属于cs通信   3.原理说明:假设有A,B ...

基于nodejs的终端天气查询

国际惯例,先上效果图 前天,突然想到,怎么直接在命令行查询天气呢?好的,那就写一个吧.然后就开始找城市.天气的api接口,最终做出来这么一个东西. 安装方法:$ npm install tianqi ...

zabbix搭建

首先创建zabbix组和用户 groupadd zabbix useradd -g zabbix zabbix mkdir -p /app/local/zabbix#然后创建zabbix编译安装目录 ...

Android——数据存储(课堂代码整理:SharedPreferences存储和手机内部文件存储)

layout文件: <?xml version="1.0" encoding="utf-8"?>

Java将其他数据格式转换成json字符串格式

package com.wangbo.util; import java.beans.IntrospectionException; import java.beans.Introspector; i ...

如何在CHROME里调试前端代码?

以前看前端们调得很神的, 刚看书到这里,作一个记录,演练了一下,确实有点神!!! :) & ...

对easyui datagrid进行扩展,当滚动条拉直最下面就异步加载数据。

以下方法是通用的,只要把datagrid定义为全局的即可,其他部分的代码不用进行修改! 可以把以下代码放入到一个单独的js文件,然后再需要的页面引入即可! $(function(){ try{ $(& ...

Django admin 组件 原理分析与扩展使用 之 sites&period;py &lpar;一&rpar;

一 . 前言 Django 提供了admin 组件 为项目提供基本的管理后台功能(对数据表的增删改查). 本篇文章通过 admin源码 简单分析admin 内部原理 ,扩展使用方式,为以后进行定制和自 ...

【AGC030D】Inversion Sum DP

题目大意 有一个序列 \(a_1,a_2,\ldots,a_n\),有 \(q\) 次操作,每次操作给你两个数 \(x,y\),你可以交换 \(a_x,a_y\),或者什么都不做. 问你所有 \(2^ ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值