学习
实践
活动
工具
TVP
写文章

如何屏蔽SIGPIPE信号

#include <stdlib.h> #include <sys/signal.h> //默认读写一个关闭的socket会触发sigpipe信号信号的默认操作是关闭进程 有时候这明显是我们不想要的 //所以此时我们需要重新设置sigpipe的信号回调操作函数 比如忽略操作等 使得我们可以防止调用它的默认操作 //信号的处理是异步操作 也就是说 在这一条语句以后继续往下执行中如果碰到信号依旧会调用信号的回调处理函数 //处理sigpipe信号 void handle_for_sigpipe() { struct sigaction sa; //信号处理结构体 memset(&sa, '\ 启动另一个Linux终端并执行killall -SIGPIPE sigpipe,可以发现sigpipe程序的默认操作关闭进程并未执行。 再次启动另一个Linux终端并执行killall -SIGPIPE sigpipe,可以发现sigpipe程序退出了。

8730

Linux异常信号——Signal

近期接触了Linux平台的测试,遇到了软件发生异常,从而接触到了 Linux平台下的Signal——信号,用来通知进程发生了异步事件。 作为测试,免不了需要初步判断一是否是正在的异常,因此学习了一Signal NO 1 信号事件的发生有两个来源: 硬件来源(比如我们按下了键盘或者其它硬件故障); 软件来源,最常用发送信号的系统函数是 (5) 在用户态的进程发出的信号。 如进程调用系统调用kill向其他进程发送信号。 (6) 与终端交互相关的信号。 如用户关闭一个终端,或按break键等情况。 NO 2 Linux支持的信号列表如下(很多信号是与机器的体系结构相关的) 信号值 默认处理动作 发出信号的原因 SIGHUP 1 A 终端挂起或者控制进程终止 ,目前位置没有遇到过 以上简单分享了Linux的Signal的含义,以及一些常用的信号值,后续还会继续有分享哟

1.4K20
  • 广告
    关闭

    11.11云上盛惠

    万元礼包限时领取,百款云产品特惠助力上云,云服务器2核2G低至4.2元/月

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux的SIGCHLD信号

    那么这两个操作对于父进程来说都不是理想的,因此可以通过SIGCHLD信号来实现异步的操作。 也就是当子进程结束的时候通过SIGCHLD信号告诉父进程,然后父进程再去释放其资源,如果没有收到该信号也不影响父进程的运行。         那么对于SIGCHLD信号来说,只有在以下三个条件中才会向父进程发送SIGCHLD信号: 1. 子进程终止时 2. 子进程接收到SIGSTOP信号停止时 3. 子进程处在停止态,接受到SIGCONT后唤醒时        下面我们通过示例来进一步详细说明,我们实现一个父进程来创建10个子进程,然后通过捕捉信号来实现上述所说的功能。 ,就可以捕捉到子进程的信号了。

    1.7K10

    linux sigpipe信号,LinuxSIGPIPE信号及其处理「建议收藏」

    Linux写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。 这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。 调用以下代码,即可安全的屏蔽SIGPIPE: struct sigaction sa; sa.sa_handler = SIG_IGN; sigaction( SIGPIPE, &sa, 0 ); // example of piping is the following. ps l | head This command, when run on a Unix-like machine (including Linux

    8920

    Linux的signal信号机制

    Linux中,要发送一个信号相当容易。程序员需要知道两个信息:要发送哪个信号,将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用的信号的列表。 ,请按ctrl+c送出SIGINT信号-------/n"); pause(); //将父进程暂停下来,等待SIGINT信号到来 } else if(childpid ------此时程序会停下来等待,请按ctrl+c送出SIGINT信号------- 已经接收到了SIGINT信号,程序将退出! (signal)介绍(Linux中国) http://www.linux-cn.com/html/linux/system/20070505/27605.shtml Linux 信号signal处理函数 (CSDN) http://blog.csdn.net/Sunboy_2050/archive/2010/10/16/5945535.aspx Linux 信号signal处理机制(CSDN) http

    1.8K20

    Linux 信号

    signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生 你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号 进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。 下面我们就来看一这些信号是干什么用的 SIGABRT 和 SIGIOT SIGABRT 和 SIGIOT 信号发送给进程,告诉其进行终止,这个 信号通常在调用 C 标准库的 abort() 函数时由进程本身启动 处于阻塞状态的进程只有再次唤醒后才会被 kill 掉 init 进程是 Linux 的初始化进程,这个进程会忽略任何信号。 当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。

    34120

    linux SIGABRT信号

    自己写的程序启动时偶尔会被SIGABRT信号杀死。故查看下SIGABRT的用法。 SIGABRT是中止一个程序,它可以被捕捉,但不能被阻塞。 当程序调用abort(3)时,该进程会向自己发送SIGABRT信号。所以,SIGABRT一般用于信号中一些关键的处理,assert失败时也会使用它。 你不应该去捕捉SIGSEGV和SIGABRT信号,如果收到这种信号,说明进程处于一个不确定的状态,很可能会直接挂起。 发现程序中确实有assert失败报错。 但是是哪个进程发送的SIGABRT信号暂时还不知道。

    21910

    Linux信号基础

    Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。 (当然,也可以完全无视这张纸条,然而在失火这样紧急的状况,无视信号不是个好的选择)。 SIGQUIT  当键盘按CTRL+\从shell中发出信号信号被传递给shell中前台运行的进程,对应该信号的默认操作是退出 (QUIT) 该进程。 SIGALRM  起到定时器的作用,通常是程序在一定的时间之后才生成该信号。 在shell中使用信号 下面我们实际应用一信号。 特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。 信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。

    59650

    Linux如何屏蔽国外IP-宝塔如何屏蔽国外IP-appnode如何屏蔽国外IP

    正文 对NGINX折腾发现很难,于是想到奇葩的解决方法 我直接屏蔽国外吧,这样就不会被打到500(手动滑稽) 然后百度找了很多文章,我靠这些ip段好老,而且很多,直接白名单国内吧,然后找到一个 https ://github.com/17mon/china_ip_list  好像是每月更新一次还不错 因为这篇文章主要还是说Linux如何屏蔽国外上面这个 可以用控制面板的黑名单直接拉黑 appnode 可以 宝塔没看见可以直接屏蔽或者白名单某个ip段或者其他,可以屏蔽指定ip ? 可以快速的让我们屏蔽某个 IP 段。这里分享一个屏蔽指定国家的 IP 访问的方法和一个屏蔽国外 IP 访问(仅允许国内 IP 访问)的方法,当我们遇到 CC 攻击,可以尝试选择和使用能有所缓解。 ip对网站是有一定好处,如果你的网站是有一定国外用户,那就不要去屏蔽,一般情况,是不会有国外用户,国外的ip一般都是对你网站进行漏洞扫描等其他操作,屏蔽后对网站也有一定好处。

    3.2K11

    Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7 UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。 登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。 当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。 不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

    29140

    Linux信号处理

    外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等。 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。 目前 Linux 支持64种信号信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux信号值为 1-31 和 34-64。 信号是异步的,一个进程不必通过任何操作来等待信号的到达。 信号实现原理 接下来我们分析一Linux信号处理机制的实现原理。 成员 blocked 表示被屏蔽的信息,每个位代表一个被屏蔽信号。 设置信号处理程序 最后我们来分析一怎么设置一个信号处理程序。

    84540

    Linux c++多线程同步之信号

    IPC_CREAT如果信号量不存在,则创建一个信号量,否则获取。 IPC_EXCL只有信号量不存在的时候,新的信号量才建立,否则就产生错误。 struct sembuf{ nsigned short sem_num;//第几个信号量,第一个信号量为0 short sem_op;//对该信号量的操作。 short _semflg; }; sem_num: 操作信号信号集中的编号。第一个信号的编号为0; sem_op : 如果其值为正数,该值会加到现有的信号内含值中。 IPC_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况结束时未将锁定的资源解锁,造成该资源永远锁定。 以上借鉴 信号Linux函数 semget();semctl();semop(); 信号量阻塞案例 void debugPrint(char *objName, char *objAct, char

    93610

    Linux进程通信——信号

    Linux的通信机制是遵从POSIX标准的。34号信号SIGRTMIN信号之前的是早期UNIX操作系统的。它们是不可靠的信号。 (这个和Qt的信号槽差不多) 执行默认动作:Linux对每一个信号都规定了默认操作(可靠信号的默认操作是进程终止)。 pid有下面几种情形,分别对应于不同情况应用。 还需要一个用于捕捉信号的函数。在Linuxpause()函数用于捕捉信号,如果没有信号发生,pause函数将会一直等待。直到有信号发生。 ; //用来设置处理该信号的时候暂时屏蔽sa_mask指定的信号 int sa_flags; //设置信号处理的方式 int

    1.1K30

    linux信号解释(3)--信号处理机制

    如果需要进程捕获某个信号,并作出相应的处理,就需要注册信号处理函数(其实就是内核里需要识别信号函数,类似C语言里的include某函数库)。      处理信号就类似软中断,内核为每个进程准备了一段信号向量表,记录信号的处理机制。当某个信号发生后,内核就会调用注册的函数去处理。     信号何时来,是未知的,因此进程不可能一直等待信号来。 信号的接收不是有用户进程来完成,需要内核来代理。当用户进程P2向另一个进程P1发送信号后,内核接收到信号,将信号放置P1进程的信号队里中。 当P1进程进入内核态时,会检查信号队列,并调取相应的信号函数进行处理。 ?

    34900

    L007Linux信号信号处理和信号处理函数

    一、信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种。 1、 硬件方式 当用户在终端上按某键时,将产生信号。如按组合键后将产生一个SIGINT信号。 二、信号的种类 在Shell输入kill –l 可显示Linux 系统支持的全部依赖,信号列表如下: 1) SIGHUP 2) SIGINT 3) SIGQUIT signal.h中,在Linux中没有16和32这两个信号。 (2) SIGINT:用户按组合键时,用户端时向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。 (30) SIGRTMIN~SIGRTMAX:Linux的实时信号,它没有固定的含义(或者说可以由用户自由使用)。注意,Linux线程机制使用了前3个实时信号。所有的实时信号的默认动作都是终止进程。

    1.3K30

    UNIX和Linux信号

    1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。 不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。 另外注意: * 多个实时信号的响应顺序是有保证的。 登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。 当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。 不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

    78040

    Linux笔记(15)| Linux信号

    今天要分享的是Linux中的信号机制,信号是一种软件中断,是一种处理异步事件的方法,可以很好地在多个进程之间进行同步和简单的数据交换。 一、发送信号 发送信号通常有三种方式,分别是使用kill、raise、sigqueue函数 1、kill函数 int kill(pid_t pid,int sig); 第一个参数代表向谁发送,第二个参数代表发送什么信号 二、信号的注册和响应 前面讲了三种发送信号的方式,但是光发送信号还不够,对于接收方来说,还得对信号进行处理。 一般可以使用signal函数和sigaction函数来注册信号。 成员sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。 接下来写一个简单的代码,来应用一上面的几个函数。实现的需求就是创建一个子进程,父进程每隔一秒钟向子进程发送一个信号,子进程收到信号之后往一个txt文档中写入一句话。

    30510

    Linux系统-进程信号

    Linux系统-进程信号 零、前言 一、信号入门 1、生活角度的信号 2、技术应用角度的信号 3、信号及其处理概念 二、信号产生 1、终端按键产生 2、kill命令发信号 3、软件条件产生信号 4、硬件异常产生信号 volatile关键字 5、SIGCHLD信号 零、前言 本章主要讲解学习Linux中的信号,从信号的产生到识别,再到处理的各个时期的详细学习 一、信号入门 1、生活角度的信号 示例: 你在网上买了很多件商品 有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态 阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略 ,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么它会被阻塞到当前处理结束为止 如果在调用信号处理函数时 ,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽信号,当信号处理函数返回时自动恢复原来的信号屏蔽字 sa_flags字段包含一些选项,本章的代码都把

    5810

    Linux信号列表及其详解

    我们运行如下命令,可看到Linux支持的信号列表: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。 登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。 当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。 不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

    9.2K30

    扫码关注腾讯云开发者

    领取腾讯云代金券