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. Python学习---线程锁/信号量/条件变量同步/线程池1221

    线程锁 问题现象: 多线程情况下,CPU遇到阻塞会进行线程的切换,所以导致执行了tmp-=1的值还未赋值给num=tmp,另一个线程2又开始了tmp -=1,所以导致最后的值重复赋值给了num,所以出 ...

  2. js函数 标签: javascript 2016-08-12 16:48 56人阅读 评论(0) 收藏

    函数实际上是对象,函数名实际上也是一个指向函数对象的指针. 使用不带圆括号的函数名是访问函数指针,而非调用函数. 函数声明和函数表达式: alert(test(2,3)); function test ...

  3. 设置dedecms标签 [field:global.autoindex/] 初始值{class递增}

    在{dede:arclist/}这个标签中有个[field:global.autoindex/],是从0开始自增,如果我们想自定义一个数值,比如自定义从2开始.那么就可以写成下面代码: [field: ...

  4. LVM逻辑卷的管理和使用

    本篇将从头到尾演示一遍逻辑卷的管理. 主要步骤 1.创建lv逻辑卷步骤     前提:先创建3个磁盘分区,类型为8e:         1.PV创建             pvcrete /dev/ ...

  5. 为tcp的connect设置超时时间

    struct timeval tv = {timeout, 0}; 27   setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(s ...

  6. bep-10翻译

    dht协议的目的是解放tracter服务器,将tracter的任务分布式存到各个客户端上(即维护资源文件的下载列表,从哪能下载到请求的文件): dht协议在get_peer请求获得peer信息后,就会 ...

  7. 关于数据库插入sql操作速度的影响

    大概看了以下,适当多线程数据库连接操作比单线程效率高 多个sql语句组合后调用数据库连接执行比单个sql循环执行效率高的多 下面是几个参考资料,有空的时候详细整理一下 https://blog.csd ...

  8. Expression拼接

    public static class PBuilder { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效,多个OR无效:混应时 ...

  9. hdu-3524 Perfect Squares---打表+找规律+循环节

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3524 题目大意: 求i^2 mod 2^n有多少可能 解题思路: 先打表,求出n较小的时候的数据 n ...

  10. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...