前言:之前说看《C++ Primer 》暂时搁浅一下,迷上公司大神写的代码,想要明白,主要是socket、进程间通信!

  知道进程间通信:信号、信号量、管道、消息队列、共享内存(共享存储),也能写些简单代码进行通信,但不知道应用在哪?感觉很多小伙伴跟我有类似经历吧?

  一、应用实例:

  要去linux设备上去添加、改密用户:本地去linux设备添加用户,用socket实现,其实大神改的ssh源码来实现的,这不是我要讲的重点,而我要讲的是准备过程,去登陆linux设备,要准备好:管理员、密码等。

  简略说明中间过程:页面点击添加,调用cli(socket的客户端,socket本地通信),server.c(socket服务端)里fork子进程,而实现登录linux设备的是ssh进程,但是ssh进程需要管理员、密码等信息,那子进程怎么传给它,就需要进程间通信方式了,大神用的是消息队列。

  讲到这里不知道明白了么?有问题可以随时留言。

  接下来将详解进程间通信方式。

  二、进程间通信-信号:

  1、信号概念:

  信号的概念
  首先,每个信号都有一个名字。这些名字都以三个字符 S I G开头。 S I G A L R M是闹钟信号,当由a l a r m函数设置的时
间已经超过后产生此信号。

  产生信号条件:

  • 当用户按某些终端键时,产生信号。
  • 硬件异常产生信号:除数为0、无效的存储访问等等。
  • 进程用k i l l 函数可将信号发送给另一个进程或进程组。
  • 用户可用k i l l 命令将信号发送给其他进程。此程序是 k i l l函数的界面。
  • 当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。

  可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作:

  (1) 忽略此信号。 
  (2) 捕捉信号。 
  (3) 执行系统默认动作。
  2、signal函数

  signal(int signum, sighandler_t handler);

  格式 :signal(信号,信号处理函数)
  功能 :登记信号 当信号到来时 执行信号处理函数 而不采用默认的处理方式

  注:sighandler_t是函数指针,typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

  程序:检测信号,调用处理函数 

#include "my.h"

void sig_fun(int sig)
{
puts("ding-ling!");
} int main()
{
signal(SIGALRM,sig_fun);
alarm();
for(;;) {}
return ; }

---程序2.2---

注:

  5秒之后产生产生SIGALRM信号,调用sig_fun函数。

  alarm函数:

  使用a l a r m函数可以设置一个时间值 (闹钟时间),在将来的某个时刻该时间值会被超过。当
所设置的时间值被超过后,产生 S I G A L R M信号。

  #include <unistd.h>
  unsigned int alarm(unsigned int s e c o n ds) ;  

  注:“my.h”是我自定义头文件,因为头文件方便书写,为了便于调试和理解,把头文件粘出来,如下: 

#ifndef MY_H_
#define MY_H_ #include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <semaphore.h>
#endif

  3、其他常用函数

  (1)kill和r a i s e函数
  k i l l函数将信号发送给进程或进程组。 r a i s e函数则允许进程向自身发送信号。    

  #include <sys/types.h>  

  #include <signal.h>

  int kill(pid_t p id, int s i g no) ;
  int raise(int s i g n o) ;
  两个函数返回:若成功则为 0,若出错则为-1

  (2)pause函数
  p a u s e函数使调用进程挂起直至捕捉到一个信号。
  #include <unistd.h>
  int pause(void);

  程序:优化“程序2.2”,用pause函数代替死循环,检测信号之后并退出,如下:

#include "my.h"

void sig_fun(int sig)
{
puts("ding-ling!");
} int main()
{
signal(SIGALRM,sig_fun);
alarm();
printf("111\n");
pause();
//for(;;) {}
printf("222\n");
return ; } ---程序2.---

总结:以上介绍进程间通信应用实例,然后介绍了进程间通信的信号,接下来会介绍其余进程间通信方式。

 

  

  

  

  

  

详解linux进程间通信-信号的更多相关文章

  1. 详解linux进程间通信-消息队列

    前言:前面讨论了信号.管道的进程间通信方式,接下来将讨论消息队列. 一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构 ...

  2. 详解linux进程间通信-管道 popen函数 dup2函数

    前言:进程之间交换信息的唯一方法是经由f o r k或e x e c传送打开文件,或通过文件系统.本章将说明进程之间相互通信的其他技术-I P C(InterProcess Communication ...

  3. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

  4. Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

    1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...

  5. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  6. linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)

    linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...

  7. 详解linux运维工程师入门级必备技能

    详解linux运维工程师入门级必备技能 | 浏览:659 | 更新:2013-12-24 23:23 | 标签:linux it自动化运维就是要很方便的运用各种工具进行管理维护,有效的实施服务器保护 ...

  8. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  9. Linux进程间通信——信号集函数

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

随机推荐

  1. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. python Django注册页面显示头像

    python Django注册页面显示头像(views) def register(request): ''' 注册 :param request: :return: ''' if request.m ...

  3. redis从入门到

    下载 首先我们要到GitHub(https://github.com/MicrosoftArchive/redis/releases)上下载Source code (tar.gz) 上传到Linux上 ...

  4. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

  5. jmeter出现卡死或内存溢出的解决方案

    故事背景:在初次使用jmeter的时候,把线程设置较大值的时候,jmeter工具很容易就卡死了,导致每次做压测的时候都无法顺利完成,非常的闹心,通过各种方法寻找解决方案,终于找到了一个比较靠谱的方法, ...

  6. 【js 笔记】读阮一峰老师 es6 入门笔记 —— 第一章

      鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ...

  7. hive新特性reflect函数介绍

    reflect函数可以支持在sql中调用java中的自带函数,秒杀一切udf函数. 使用案例1:所有记录执行相同的java内置函数 hive中建一张表test_udf:column1(int),col ...

  8. [LeetCode] Shortest Completing Word 最短完整的单词

    Find the minimum length word from a given dictionary words, which has all the letters from the strin ...

  9. [ZJOI 2013]丽洁体

    Description 题库链接 给出四个字符串 \(T,A,B,C\) ,问你至少在 \(T\) 串中删去几个单词能使得 \(T\) 串变为 \(A?B?C\) 的形式,其中 \(?\) 表示任意多 ...

  10. [HAOI2016]找相同字符

    题目描述 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式 输入格式: 两行,两个字符串s1,s2,长度分别为 ...