LINUX信号发送

测试环境:ubuntu 16.0

编译器:       g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 (查看版本指令:g++ --version)

实验目的: 使用int kill(pid_t pid, int sig); 函数发送信号

实验步骤:子进程发送信号,父进程接收子进程发送的信号进行处理

以下为测试代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <errno.h>
 6 #include <signal.h>
 7 #include <sys/types.h>
 8
 9 //铃铛的状态
10 #define  START 1
11 #define  break 0
12
13 //响铃状态
14 static int ding_status = 0;
15
16 void SignalFunc(int sig_num)
17 {
18     //对信号进行处理
19     switch (sig_num)
20     {
21     case SIGALRM:
22         ding_status = 1;
23         break;
24     }
25 }
26
27 int main(int argc, char* argv[])
28 {
29     pid_t pid;
30
31     pid = fork();
32     switch (pid)
33     {
34     case -1:
35         perror("main()->fork!\n");
36         break;
37
38     case 0:        //子进程向父进程发送消息
39         sleep(2); //让父进程先执行等待
40
41         int sendStaus = kill(getppid(), SIGALRM);
42         if (-1 == sendStaus)
43         {
44             perror("subProcess send signal fail! \n");
45             exit(1);
46         }
47         break;
48
49     }
50
51     //父进程注册处理信号
52     signal(SIGALRM, SignalFunc);
53
54     //阻塞点的作用
55     //主要目的:挂起进程等待信号输入
56     pause();
57
58     if (START == ding_status)
59     {
60         printf("ding ding ding ding !!!!\n");
61     }
62
63     return 0;
64 }

1.运行结果:

[email protected]:~/projects/proj$ ./main

ding ding ding ding !!!!

2.遇到的坑:

不小心写成父进程sleep,子进程发送信号先结束,之后父进程没有接收到任何信号。

忘记了fork() 执行之后,父子谁先结束是由内核决定的,

真正的步骤应该是:

  2.1  子进程进行sleep

  2.2   父进程调用pause()进程进行挂起

    2.3  子进程发送信号,父进程接收信号结束挂起,在注册中查询是否注册该信号,如有存在则执行函数.

时间: 2024-10-12 20:10:54

LINUX信号发送的相关文章

Linux信号发送与作业控制

前言 Linux中进程间通信又称为IPC(Inter process communication),大致上可以分为这么几类:消息队列(message queue),旗语(semerpore),共享内存(shared memory),信号(signal),Unix域套接字,socket等. 一.信号发送 signal用来向进程传递微小的信息. 显示可用信号: kill -l man 7 signal 1.kill命令 格式: kill [-SIGNAL] PID SIGNAL: (1) 信号的完整

linux 编程 linux 信号发送(通过man获取详细介绍)

操作信号集: sigemptyset sigaddset 绑定信号处理函数: signal sigaction 屏蔽: sigprocmask 发送: sigqueue kill 获取: sigpending

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

Linux 信号signal处理机制(ZZ)

http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP

Linux信号列表

我们运行如下命令,可看到Linux支持的信号列表:~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) S

Linux信号(signal) 机制分析

[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等.最后介绍了应用层的相关处理,主要包括信号处理函数的安装.信号的发送.屏蔽阻塞等,最后给了几个简单的应用实例. [关键字]软中断信号,signal,sigaction,kill,sigqueue,settimer,sigmask,sigprocmask,sigset_t 1       信

Linux信号详解

Linux信号详解 一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于 SIGRTMIN的都是非可靠信号. 非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信 号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值 位于 [SIGRTM

Linux 信号signal处理机制

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件.基本概念对于理解和使用信号,对于理解信号机制都特别重要.下面就来看看什么是信号. 1.基本