linux进程篇 (三) 进程间的通信2 信号通信
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 信号通信的更多相关文章
- linux进程篇 (三) 进程间的通信1 管道通信
通信方式分4大类: 管道通信:无名管道 有名管道 信号通信:发送 接收 和 处理 IPC通信:共享内存 消息队列 信号灯 socke 网络通信 用户空间 进程A <----无法通信----> ...
- linux进程篇 (三) 进程间的通信3 IPC通信
3 IPC通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...
- linux进程篇 (二) 进程的基本控制
2. 进程的基本操作 接口函数 #include <unistd.h> //创建子进程 pid_t fork(void); //结束子进程 void exit(int status); / ...
- iOS开发多线程篇 04 —线程间的通信
iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...
- linux进程篇 (一) 进程的基本概念
进程是系统资源分配的最小单位. 1.创建和执行 父进程通过 fork 系统调用创建子进程, 子进程被创建后,处于创建状态. linux为子进程配置数据结构,如果内存空间足够,子进程就在内核中就绪,成为 ...
- linux线程篇 (三) 线程的同步
1 互斥量 pthreat_mutex_t mymutex; //1. 创建 初始化 int pthread_mutex_init(pthread_mutex_t *mutex, const pthr ...
- Linux基础篇三:文件系统
/bin 实际上是 /usr/bin /sbin 实际上是 /usr/sbin /usr/bin 里面的命令其实是依赖 /lib64 或者 /lib32 ldd /us ...
- c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...
- 【Linux程序设计】之进程间的通信
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的. 实验题目:Linux环境下的进程间通信 实验目的:熟悉进程通信中信号概念及信号处理:掌握进程间的管道通信编程 ...
随机推荐
- Angular4 微信的坑
1.不要重置对象的引用!(重置只应该在组件或服务的初始化时) why:会使页面产生闪烁 2.不要给图片绑定一个空的值或空的图片引用(如果值从服务器异步过来,那应该在初始化时给它一个默认值) why:会 ...
- PPTP vs. OpenVPN vs. L2TP/IPsec vs. SSTP
Which is the Best VPN Protocol? PPTP vs. OpenVPN vs. L2TP/IPsec vs. SSTP Want to use a VPN? If you’r ...
- Python学习---进程 1225
进程创建 进程创建: 第一种:直接创建 第二种:利用类来实现 第一种:直接创建 from multiprocessing import Process import time def f(name): ...
- 实验 MPLS LDP配置
实验 MPLS LDP配置 一.学习目的 掌握启用和关闭MPLS的方法 掌握启用和关闭MPLS LDP配置方法 掌握使用MPLS LDP配置LSP的方法 二.拓扑图 三.场景 你是公司的网管员,公司的 ...
- [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函 ...
- redis三节点sentinel部署
角色 ip port master 127.0.0.1 6379 slave-1 127.0.0.1 6380 slave-2 127. ...
- Vue收藏资料
组件库的全局引用和按需引用:http://www.cnblogs.com/zhuanzhuanfe/p/7516745.html
- hdu-2879 hehe---积性函数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2879 题目大意: he[n]为小于n且满足x^2 = x (mod n)的个数 hehe[n] = ...
- Django logging的介绍
Django用的是Python buildin的logging模块. Python logging由四部分组成: Loggers - 记录器 Handles - 处理器 Filters - 过滤器 F ...
- Linux关于scp命令
声明:本文主要转自https://www.2cto.com/os/201503/379474.html scp主要应用场景如下: (1)必要时,每个季度或者每月将数据由这台服务器传输到另外一台,不过前 ...