2. 信号通信

用户空间          进程A       <----无法通信---->          进程B
-----------------|--------------------------------------|--------------
| |
内核空间 |<-------------> 信号 <--------------->| ---------------------------------------------------------------------- () 信号的发送 kill raise alarm
() 信号的接收 pause sleep while
() 信号的处理 signal ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP
) SIGABRT ) SIGBUS ) SIGFPE ) SIGKILL ) SIGUSR1
) SIGSEGV ) SIGUSR2 ) SIGPIPE ) SIGALRM ) SIGTERM
) SIGSTKFLT ) SIGCHLD ) SIGCONT ) SIGSTOP ) SIGTSTP
) SIGTTIN ) SIGTTOU ) SIGURG ) SIGXCPU ) SIGXFSZ
) SIGVTALRM ) SIGPROF ) SIGWINCH ) SIGIO ) SIGPWR
) SIGSYS ) SIGRTMIN ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX 发什么信号()
发给谁(pid)

2.1 信号的发送

#include <signal.h>
#include <sys/types.h> // 发送
int kill(pid_t pid, int sig);
int raise(int sig); //发信号给自己 == kill(gitpid(),sig)
#include <unistd.h>
unsigned alarm(unsigned seconds); //接收
while();
sleep();
int pause(void); //成功0 失败-1 进程状态为S。 //处理
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
//or in the equivalent but easier to read typedef'd version:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
int kill(pid_t pid, int sig);
/*pid
正数 要接收信号的pid
0 信号发送到和pid同一个进程组的进程
-1 信号发送给所有进程表的进程 返回值: 0成功 -1失败
*/
int raise(int sig);    //发信号给自己 == kill(gitpid(),sig)
//raise(9) == _exit(),不输出缓存,直接消亡
#include <unistd.h>
unsigned alarm(unsigned seconds);
//和raise一样 只发送信号给自己,延迟一段时间后发送
//发送闹钟信号的函数 默认处理是终止进程

2.2 信号的处理

void (*signal(int sig, void (*func)(int)))(int);
//or in the equivalent but easier to read typedef'd version:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func); //分析void (*signal(int sig, void (*func)(int)))(int);
void (*func)(int) //函数指针,返回值viod, 1个int参数 -> A
signal(int sig, A) 所以 signal 返回的就是一个函数指针, void (*P)(int); //一个带 int参数,返回值为void的函数指针
//P== signal(int sig, A) 所以 signal 返回的就是一个函数指针,
typedef void (*sig_t) (int);
//整个函数有2个地方可以替换
sig_t signal(int sig, sig_t func)
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func) /*
1,处理什么信号 2,怎样处理这个信号 SIG_IGN 忽视该信号
SIG_DFL系统默认
自定义
*/

例子:

1.kill 自己写一个杀死进程函数

#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char const *argv[])
{
/*kill 并非杀死进程 kill 9 pid 才是杀死一个进程,kill是信号通信的框架。
* 下面将搭建kill 信号通信的框架
*/ int sig,pid;
int ret; if(argc < ){
puts("请输入正确的参数 !");
return -;
} sig = atoi(argv[]);
pid = atoi(argv[]);
printf("sig = %d, pid = %d\n", sig,pid); ret = kill(pid,sig);
if(ret < ){
perror("kill");
return -;
}
return ;
}

2.signal 信号处理

#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h> //wait调用相关函数库 #define CHLD 20 //mac CHLD是20,linux 是17 void sig_fun1(int signum){
int i;
while(i < ){
printf("sig fun ,signum is %d,i =%d\n",signum,i);
i++;
sleep();
}
return;
} void sig_exit(int signum){
printf("recv sig %d",signum);
wait();
return;
} int main(int argc, char const *argv[])
{
pid_t pid;
pid = fork();
if(pid > ){ //子进程 int i;
signal(,sig_fun1);
signal(CHLD,sig_exit); while(i < ){
printf("我是子进程,i = %d\n",i);
i++;
sleep();
} }else{ //父进程
sleep();
puts("我是子进程");
kill(getppid(),);
exit();
}
return ;
}

linux进程篇 (三) 进程间的通信2 信号通信的更多相关文章

  1. linux进程篇 (三) 进程间的通信1 管道通信

    通信方式分4大类: 管道通信:无名管道 有名管道 信号通信:发送 接收 和 处理 IPC通信:共享内存 消息队列 信号灯 socke 网络通信 用户空间 进程A <----无法通信----> ...

  2. linux进程篇 (三) 进程间的通信3 IPC通信

    3 IPC通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...

  3. linux进程篇 (二) 进程的基本控制

    2. 进程的基本操作 接口函数 #include <unistd.h> //创建子进程 pid_t fork(void); //结束子进程 void exit(int status); / ...

  4. iOS开发多线程篇 04 —线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

  5. linux进程篇 (一) 进程的基本概念

    进程是系统资源分配的最小单位. 1.创建和执行 父进程通过 fork 系统调用创建子进程, 子进程被创建后,处于创建状态. linux为子进程配置数据结构,如果内存空间足够,子进程就在内核中就绪,成为 ...

  6. linux线程篇 (三) 线程的同步

    1 互斥量 pthreat_mutex_t mymutex; //1. 创建 初始化 int pthread_mutex_init(pthread_mutex_t *mutex, const pthr ...

  7. Linux基础篇三:文件系统

    /bin      实际上是  /usr/bin /sbin    实际上是  /usr/sbin /usr/bin 里面的命令其实是依赖  /lib64  或者    /lib32 ldd  /us ...

  8. c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...

  9. 【Linux程序设计】之进程间的通信

    这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的. 实验题目:Linux环境下的进程间通信 实验目的:熟悉进程通信中信号概念及信号处理:掌握进程间的管道通信编程 ...

随机推荐

  1. MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  2. html基值 仿淘宝

    $(function(){ var scale = 1 / devicePixelRatio; document.querySelector('meta[name="viewport&quo ...

  3. python 时间和时间戳的转化

    时间戳与时间之间的转换,需要一个中间过程,即将先将时间或时间戳先转为时间元组! 1.时间转时间戳: import datetime, time s = datetime.datetime(2016,6 ...

  4. webpack导学

    随着前端工程越来越复杂,单独建几个文件写业务代码,这样的方式已经无法保证项目的可维护性了. 所以我们就想把不同的逻辑拆成模块,然后分开引入这些模块,每个模块自己做自己的事情,这样就可以保证项目的可维护 ...

  5. STL - next_permutation 全排列函数

    学习: http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html http://blog.csdn.net/ac_gibson/article/deta ...

  6. 3springboot:springboot配置文件(配置文件、YAML、属性文件值注入<@Value、@ConfigurationProperties、@PropertySource,@ImportResource、@Bean>)

    1.配置文件: springboot默认使用一个全局配置文件 配置文件名是固定的   配置文件有两种(开头均是application,主要是文件的后缀): ->application.prope ...

  7. 使用GraphViz画caffe网络结构图

    参考http://blog.csdn.net/happynear/article/details/45440709 1. 安装pydot: sudo pip install pydot 2. 安装Gr ...

  8. PAT——1001 害死人不偿命的(3n+1)猜想 (15)

    对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1? 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值. 输出格式:输出从n计算到1需要的步数. 输入样例 ...

  9. WebApiClient.AOT.dll 调用api地址 -> 调用方法

    优点:简化api调用过程,WebApiClient.AOT.dll中的IHttpApi接口 缺点:只适用于内部服务之间的调用(没有验证过程) 1.继承IHttpAPi接口 public interfa ...

  10. 关于SQL优化这些你了解吗?

    目录树 背景 优化点 前提必备知识 优化之一 - 从数据库设计方面考虑 优化之二 - 从SQL语句优化方面考虑 优化之三 - 读写分离与分库分表 背景 在当今这个互联网的时代无非要解决两大难题,其一是 ...