进程之间信号收发并携带数据

一个进程向指定进程发信号, 并传递数据

发送端代码如下:

send_data_signo.c

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

int main(int argc, char ** argv)
{
    union sigval    value;
    int        signum = SIGTERM;    // 默认发送SIGTERM
    pid_t        pid;
    int        i;

    /*初始化*/
    value.sival_int = 0;    

    /*检查参数的个数*/
    if (argc != 3 && argc != 5 && argc != 7) {
        printf("./send_data_signo <-d data> <-s signum> [-p][data]\n");
        exit(1);
    }

    /*从命令行参数解析出信号编号、PID以及待传递的数据*/
    for (i=1; i<argc; i++) {
        if (!strcmp(argv[i], "-d")) {
            value.sival_int = atoi(argv[i+1]);
            continue;
        }
        if (!strcmp(argv[i], "-s")) {
            signum = atoi(argv[i+1]);
            continue;
        }
        if (!strcmp(argv[i], "-p")) {
            pid = atoi(argv[i+1]);
            continue;
        }
    }

    /*利用sigqueue给pid发送信号signum,并携带数据value*/
    if (sigqueue(pid, signum, value) < 0) {
        perror("sigqueue");
        exit(1);
    }

    return 0;
}

接收端代码如下:

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

/*三参数的信号处理程序*/
void handler_sigint(int signo, siginfo_t *siginfo, void * pvoid)
{
    printf("recv SIGINT, the data value is:%d\n", siginfo->si_int);
}

int main()
{
    struct sigaction act;

    /*赋值act结构*/
    act.sa_sigaction = handler_sigint;
    act.sa_flags = SA_SIGINFO;        // 指定使用三参数的信号处理函数
    /*安装信号处理函数*/
    sigaction(SIGINT, &act, NULL);

    while(1)
        ;

    return 0;
}

编译/链接后, 分别在两个终端执行, 输出如下:

接收端打印信号, 及携带的数据

发送端

发送端向进程号为18617的进程发信号2(SIGINT)并携带数据, 后又发9(SIGKILL)也携带数据.

时间: 2024-10-10 15:48:32

进程之间信号收发并携带数据的相关文章

python进程之间修改数据[Manager]与进程池[Pool]

#前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocessing import random def f(l,n): l.append(n) if __name__ == '__main__': m = multiprocessing.Manager() m_dict = m.dict() m_list = m.list(range(4)) p_list

VC++共享数据段实现进程之间共享数据

当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.#pragma data_seg("foo")//建立一个叫“foo”的数据段#pragma comment(linker,"/SECTION:foo,RWS")//设置段foo的属性为“可读可写共享” int bar=0;//这些变量是共享的,不同的进程之间都可以访问到.int bar233=1;int foobar=9;int 

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管

进程之间的通信方式

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件.除此以外,那就是双方都可以访问的外设了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率太低了,而人们对

linux程序设计——进程和信号总结(第十一章)

11.4.2    信号集 头文件signal.h定义了类型sigset_t和用来处理信号集的函数.sigaction和其他函数.sigaction和其他函数将用这些信号集来修改进程在接收到信号时的行为. #include <signal.h> int sigaddset(sigset_t *set, int signo); int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigdelset(sigset_t

进程之间通行

[转] 鸣谢http://www.cnblogs.com/xiazh/archive/2012/11/08/2757882.html 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通

python 进程之间互相通信-----&gt;队列(推荐使用)

1.进程之间相互通信有几种实现方式. multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的,推荐使用队列,因为管道也需要处理锁的问题. 2队列的主要方法 # 1.q.put方法用以插入数据到队列中,# put方法还有两个可选参数:blocked和timeout.如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间.# 如果超时,会抛出Queue.Full异常.如果blocked为Fals

进程之间的通信

1无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式.3 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.4信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种

第9章 进程和信号(一)

本文目录: 9.1 进程的简单说明 9.11 进程和程序的区别 9.12 多任务和cpu时间片 9.13 父子进程及创建进程的方式 9.14 进程的状态 9.15 举例分析进程状态转换过程 9.16 进程结构和子shell 9.2 job任务 9.3 终端和进程的关系 9.4 信号 9.41 需知道的信号 9.42 SIGHUP 9.43 僵尸进程和SIGCHLD 9.44 手动发送信号(kill命令) 9.45 pkill和killall 9.5 fuser和lsof 9.1 进程简单说明 进