首页 > 系统相关 >linux下的进程(二)

linux下的进程(二)

时间:2024-03-23 20:32:38浏览次数:26  
标签:函数 int 指定 屏蔽 信号 linux 进程

进程间的通信

目录

进程间的通信

信号

信号由谁产生 ?

信号的处理

信号的捕获

信号的发送

发送多个信号

信号集

阻塞式等待信号

信号

什么是信号?信号是给程序提供一种可以处理异步事件的方法,它利用软中断实现。不能定义信号,所有信号都是由系统预定义的

信号由谁产生 ?

1.由shell终端根据当前发送的错误(段错误,非法指令等)而产生相应的信号

2.在shell终端,使用kill或killall命令产生信号

信号的处理

忽略此信号

捕捉此信号,指定信号函数进行处理

执行系统默认操作,大多数都是终止进程

信号的捕获

信号的捕获指:指定接收到某种信号后,去执行指定的函数

注:SIGKILL和SIGSTOP不能被捕获

        也就是说信号的响应不能被改变

使用:

typedef void (*sighandler_t)(int)

signhandler_t signal(int signum,sighandler_t handler);

注:signal 返回类型和第二个参数都是函数指针类型,第一个参数表示信号类型

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>

void myhandle(int sig)
{
    printf("Catch a signal : %d\n",sig);
}

int main(){
    signal(SIGINT,myhandle);
    while(1){
    sleep(1);
    }
    return 0;
}

输出:原本ctrl+c会中断程序运行,捕获后则按执行函数

信号的发送

使用kill函数

使用alarm函数,给自己发送SIGALRM信号,单位是秒每个进程最多使用一个闹钟

使用raise函数,给本进程发送信号,可指定信号类型

发送多个信号

        某进程正在执行某个信号对应的操作函数期间,此时又收到多个同一个信号

if sig<32则只能再响应一次

else响应多次,但是,每次都必须等响应函数执行完后,再响应下一次

        某进程...                        收到另一个信号

if sig 被包含在当前信号的signaction的sa_mask(信号屏蔽集)中,则不会立即处理,直到3当前信号处理函数执行完后,才去执行该信号的处理函数

else: 立即中断当前函数,而去执行新的信号处理函数

信号集

信号集,用sigset_t表示,实质是一个无符号长整型,用来表示多个信号的集合

基本操作:

sigemptyset    清空信号集        sigfillset        把已定义的信号填充到指定信号集

sigdelset        从指定信号集删除信号        sigaddset从指定信号集添加指定的信号

sigismember        判断指定的信号是否在信号集中

进程的"信号屏蔽字"

进程的"信号屏蔽字"是一个信号集

修改进程的"信号屏蔽字":

int sigprocmask(int how,const sigset_t *set,sigset_t* oldset);

how: SIG_BLOCK//添加信号    SIG_UBLOCK//删除信号      SIG_SETMASK设为信号屏蔽字

oldset:返回原来的信号屏蔽字

获取未处理的信号:

通过sigpending函数获取已发生但未被处理的信号

阻塞式等待信号

pause:         阻塞线程,直到发生某一信号后

sigsuspend:        用指定的参数设置信号屏蔽字,然后阻塞时等待信号的发生

标签:函数,int,指定,屏蔽,信号,linux,进程
From: https://blog.csdn.net/KKKK250/article/details/136972517

相关文章

  • 高效率编程之多进程
    目录 一.多任务原理1.并发与并行二.进程1.概念2.使用进程1.单进程现象2.启动进程实现多任务3.主进程负责调度4.父子进程的先后顺序3.全局变量在多个子进程中不能共享4.启动大量子进程5.map方法(重点)6.单进程与多进程复制文件对比7.进程间通信8......
  • SH文件从Window拷贝到Linux运行失败
    1.问题现象bash:./startup.sh:/bin/bash^M:解释器错误:没有那个文件或目录这个错误通常发生在尝试在Unix-like系统中执行脚本时,脚本文件的行尾结束符是Windows风格的CRLF(回车+换行,即\r\n),而不是Unix风格的LF(换行,即\n)。/bin/bash^M说明了这个问题,^M是字符\r的控制台输出表......
  • [nodejs] pm2 : nodejs 的进程管理工具
    0pm2概述0.1序0.2pm2简述PM2是一款非常优秀的Node进程管理工具,它有着丰富的特性:能够充分利用多核CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(clustermodel)和超出最大内存限制等情况下实现自动重启。PM2是开源的基于Nodejs的应用进程管理器,包括守护进......
  • linux下的进程
    创建进程众所周知linux由unix发展而来,所以本文先就unix进程先论为快,unix的进程创建很特别,许多其它的操作系统都提供了产生(spawn)进程的机制:首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。unix采用与众不同的实现方式:它把上述步骤分解到两个单独的函数中去执行f......
  • Linux--Flappy_bird实现
    目录voidhandler(intsig): mian:voidinit_curses()intset_timer(intms_t); 小鸟的操作: voidshow_pipe(): voidcreate_list()voidclear_pipe()voidmove_pipe(); test_bird.c完整代码:代码实现:#include<stdio.h>#include<curses.h>#include<signal.......
  • linux分卷压缩解压
    1.压缩:.首先是考虑压缩,无论在windosw还是linux中tar这个压缩工具都有(windows可以使用7z这个工具进行分卷tar的压缩,自行网络下载)7z安装好windows下右键菜单就可以找到linux下压缩命令:格式tarcvzf-filedir|split-d-b50m-filename样例:tarcvzf-./dir|split-d-......
  • Linux 创建用户不创建家目录,配置ssh密钥的方式
    创建用户不创建家目录useradd-Mtest-user创建ssh密钥对文件#一路会车使用默认值ssh-keygen-trsa-mPEM配置test-user使用密钥vim编辑sshd_config配置文件。vim/etc/ssh/sshd_config添加以下内容,AuthorizedKeysFile配置密钥(公钥)文件所属的位置。MatchUsercodi......
  • skynet框架:跨进程组播实现方案
    存在业务场景,从单点进程(source)批量向集群内其他节点(target)推送消息,目标节点数量可能达三位数。提供一个实现方案:target上开启进程内的组播服务,只负责当前节点的组播推送业务;服务支持接收其他节点的通知消息(目标服务只在所在节点内的组播服务上做订阅等操作,由该组播服务负责管理......
  • 本地主机连接Linux虚拟机中的mongodb,并使用studio 3T连接,同时项目启动连接mongodb刷新
    本部分只做个人纪录**1.安装mongodb**本部分为尚硅谷的电影推荐系统的文档,具体以实际存放位置为准//通过WGET下载Linux版本的MongoDB[bigdata@linux~]$wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.3.tgz//将压缩包解压到指定目录[......
  • Linux操作系统学习2024.03.23
    Linux操作系统学习目标2024.03.23一.操作系统1.1作用:主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用,作为中间人,连接软件和硬件。1.2不同应用领域的主流操作程序·桌面操作系统:1.Windows系列2.macOS3.Linux·服务器操作系统:1.Linux2.Windows......