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 ;
}

最新文章

  1. Tencent://Message/协议的实现原理
  2. Android开发中的全屏背景显示方案
  3. [转]Android性能优化典范
  4. 【Xamarin报错】visual studio android 模拟器部署卡住
  5. java 字符串函数
  6. SaundProgressBar
  7. springMVC零配置吐槽
  8. weka打开提示内存不足的解决方法
  9. go learning notes
  10. Python注释、变量、常量
  11. npm安装material-design-icons总是失败
  12. 【原创】Python第二章——字符串
  13. iOS开发下载文件速度计算
  14. Pycharm代码补齐功能中的图标的意思
  15. Linux 配置mail发送邮件
  16. celery 实例进阶
  17. JSTL自定义函数完成ACL即时认证
  18. 亿级别记录的mongodb批量导入Es的java代码完整实现
  19. 第十二周PSP
  20. OpenGl学习 SelectObject函数

热门文章

  1. Dapper进行增删改查 z
  2. Cache及(HttpRuntime.Cache与HttpContext.Current.Cache)
  3. Hbase集群部署及shell操作
  4. React Router V4.0学习笔记
  5. postgresql+postgis+pgrouting实现最短路径查询(3)--流程图
  6. pycharm 设置字体大写和显示代码行号
  7. Dispatch groups 与任务同步
  8. 20165322 第九周 实现mypwd
  9. BZOJ3999:[TJOI2015]旅游(树链剖分)
  10. 关于SQL注入中编码问题的疑问