/***********************************************************************************************
相关函数:
#include <sys/types.h>
#include <signal.h> int kill(pid_t pid, int sig); int sigqueue(pid_t pid, int sig, const union sigval value);
***********************************************************************************************/ kill 与 sigqueue两个函数功能都是向进程发送信号
不同的是sigqueue函数可以传递用户参数到信号处理函数中
如果要使用sigqueue函数,则必须将sigaction结构体中的flags设置为SA_SIGINFO
同时将信号处理函数的地址赋值给sa_sigaction。 参数解释:
pid: 进程pid
sig: 要发送的信号编码
sigval: 一个共用体, 可以传递一个整形参数,
如果要传递多个参数时,可以将其包装在一个结构体中然后赋给sival_ptr
union sigval {
int sival_int;
void *sival_ptr;
};
实例1:
使用kill函数发送信号. #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h> void sig_quit(int signo)
{
if (SIGQUIT == signo) {
printf("receive SIGQUIT\n");
}
} int main(void)
{ sigset_t zeromask;
sigemptyset(&zeromask); /****使用自定义信号捕捉函数捕捉SIGQUIT信号*****/
if (mysignal(SIGQUIT, sig_quit) == SIG_ERR) {
perror("mysignal error");
return EXIT_FAILURE;
} /**
* sigsuspend函数的工作原理是:
* 首先将之前设置为阻塞的信号设置为非阻塞,及捕捉那些信号
* 然后调用pause函数挂起,直到直到接收到任意信号,并从此信号捕捉函数返回后才返回。
**/
sigsuspend(&zeromask); return EXIT_SUCCESS;
}
实例2:
调用sigqueue函数发送信号。 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h> struct value{
pid_t pid;
union sigval si_val;
}; void *thread_func(void *arg)
{
sigqueue(((struct value*)arg)->pid, SIGUSR1, ((struct value*)arg)->si_val);
pthread_exit((void*)EXIT_SUCCESS);
} void sig_usr(int signo, siginfo_t *info, void *context)
{
if (SIGUSR1 == signo) {
printf("receive SIGUSR1!\n");
printf("info.si_int = %s\n", (char*)info->si_ptr);
}
} int main(void)
{
char arg[] = "hello world!";
struct value v;
v.pid = getpid(); //得到进程id
v.si_val.sival_ptr = (void*)arg; //需要传递的参数 sigset_t zeromask;
sigemptyset(&zeromask); struct sigaction act; act.sa_sigaction = sig_usr; //信号处理程序
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO; //设置sa_flags的标志位SA_SIGINFO, 程序将自动调用sa_sigaction所指向的信号处理函数 if (sigaction(SIGUSR1, &act, NULL) < 0) {
perror("sigaction error");
return EXIT_FAILURE;
} int err;
pthread_t tid;
/****创建线程,在线程中向进程发送信号****/
err = pthread_create(&tid, NULL, thread_func, (void*)&v);
if (err != 0) {
perror("pthread_create error");
return EXIT_FAILURE;
} sigsuspend(&zeromask); /****等待线程退出***/
pthread_join(tid); return EXIT_SUCCESS;
}
实例1中使用到的mysignal函数源码:

#include <stdlib.h>
#include <signal.h> typedef void sigfunc(int); sigfunc *mysignal(int signum, sigfunc *func)
{
struct sigaction act, oldact; act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0; if (SIGALRM == signum) {
#ifndef SA_INTERRUPT
act.sa_flags = SA_INTERRUPT;
#endif
} else {
/***处SIGALRM信号外,都尝试重启系统调用***/
act.sa_flags = SA_RESTART;
} if (sigaction(signum, &act, &oldact) < 0) {
return (SIG_ERR);
} return (oldact.sa_handler); }

sigqueue与kill详解及实例的更多相关文章

  1. 红帽Linux故障定位技术详解与实例(2)

    红帽Linux故障定位技术详解与实例(2) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...

  2. XML参考 :XmlReader 详解、实例

    XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...

  3. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  4. Protocol Buffer技术详解(C++实例)

    Protocol Buffer技术详解(C++实例) 这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较 ...

  5. Java学习-007-Log4J 日志记录配置文件详解及实例源代码

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

  6. groupadd命令详解(实例)

     groupadd命令详解(实例)  1.作用groupadd命令用于将新组加入系统. 2.格式groupadd [-g gid] [-o]] [-r] [-f] groupname 3.主要参数-g ...

  7. GLSL-几何着色器详解跟实例(GS:Geometry Shader)[转]

    [OpenGL4.0]GLSL-几何着色器详解和实例(GS:Geometry Shader) 一.什么是几何着色器(GS:Geometry Shader) Input Assembler(IA)从顶点 ...

  8. CvMat、Mat、IplImage之间的转换详解及实例

    见原博客:http://blog.sina.com.cn/s/blog_74a459380101obhm.html OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数 ...

  9. C语言操作WINDOWS系统存储区数字证书相关函数详解及实例

     C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...

随机推荐

  1. Django 04 模板标签(if、for、url、with、autoeacape、模板继承于引用、静态文件加载)

    Django 04 模板标签(if.for.url.with.autoeacape.模板继承于引用.静态文件加载) 一.if.for.url.with.autoescape urlpatterns = ...

  2. List<Object> 使用Linq

    List<Asset> bdList = allAsset.Where(m => m.Owner.Depts == view.DeptName).ToList(); var quer ...

  3. js校验金额输入

    //验证非负实数,保留2位小数,不采取四舍五入,不能去掉无效零,obj是this //示例:<input type="text" onkeyup="IWS_Chec ...

  4. 有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...

  5. sql数据库发布、订阅同步方式操作

    Sql数据库发布订阅分为两个步骤:1.发布.2.订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅. 一.发布. 发布需要用实际的服务器名称,不能使用 ...

  6. web 中防止sql注入

    public class SqlInject:Page { //检测到注入后的处理方式: 0:仅警告:1:警告+记录:2:警告+自定义错误页面:3:警告+记录+自定义错误页面 ; private co ...

  7. 剑指Offer——数组中只出现一次的数字(一个很帅的异或解法)

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 看题目脑子里就出现做法了: 遍历,用个HashMap来记录出现的次数,然后再遍历HashMap返回 ...

  8. LeetCode 101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For ex ...

  9. 016 3Sum Closest 最接近的三数之和

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  10. Java面向对象_继承——基本概念以及管理化妆品实例分析

    一.继承的基本概念: 1.继承是面向对象三大特征之一 2.被继承的类成为父类(超类),继承父类的类成为子类(派生类) 3.继承是指一个对象直接使用另一个对象的属性和方法 4.通过继承可以实现代码重用 ...