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. [翻译]Elasticsearch重要文章之二:堆内存的大小和swapping

    Elasticsearch默认安装后设置的内存是1GB,对于任何一个业务部署来说,这个都太小了.如果你正在使用这些默认堆内存配置,你的集群配置可能有点问题. 这里有两种方式修改Elasticsearc ...

  2. gtest学习

    介绍 学习如下gtest课程,总结主要的部分 1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest 2.玩转Google开源C++单元测试框架Go ...

  3. SQLi-db 批量注入工具+教程

    这款工具在中国还没人发.所以我发来给大家玩玩:顺便带了教程. 关键字:inurl:article.asp?id= inurl:article.php?id=inurl:article.jsp?id=( ...

  4. PTA练习题之6.1统计字符串中大小写字母的个数(10 分)

    统计字符串中大小写字母的个数(10 分) 分别统计字符串中大写字母和小写字母的个数. 函数接口定义: void fun ( char *s, int *a, int *b ); 其中s.a.b 都是用 ...

  5. 20140316 曼联VS利物浦,罗杰斯的小九九,当4312对上4231

    一.预测的阵式!? 赛前看fourfourtwo,Whoscored的首发预测,楼主立刻意淫了阵式图,并且大言不惭在微博贴了当晚的热战区域(上图的左侧),并疑惑着,格伦·囧森打左后卫,那这……显然是逼 ...

  6. vs中ctrl+w选中智能感应的整个单词

    vs中ctrl+w选中智能感应的整个单词

  7. 四、HTTP和HTTPS的区别

    1:简介 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...

  8. 四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码安装)

    1.在Linux中创建用户mysql和主目录,并创建密码 2.解压缩tar.gz并拷贝到/usr/local/mysql目录下面 3.把/usr/local/mysql文件夹拥有者改为mysql 进入 ...

  9. Kali-linux基本设置

    1.6.1 启动默认的服务 Kali Linux自带了几个网络服务,它们是非常有用的.但是默认是禁用的.在这里,将介绍使用各种方法设置并启动每个服务. 1. 启动Apache服务 启动Apache服务 ...

  10. Hello, GitHub!

    GitHub作为版本控制的软件,我决定重新系统学习这个东西,毕竟以前都是fork.clone... 1. 理解Git思维 首先呢,我一开始就被GitHub和Git两个东西搞昏了,所以有必要理解二者的关 ...