一、信号:

信号主要用来通知进程异步事件的发生。可以使用“kill -l ”命令来显示系统中的信号。进程可以忽略大部分信号,但是有两个是不能忽略的:

(1)SIGSTOP:这个信号将中断进程的执行。

(2)SIGKILL:这个信号将强制进程退出。

Linux使用了堆栈来管理要执行的信号处理程序,这样当一个信号处理程序完成操作时,下一个将被调用,依次下去。

当进程收到信号后,怎么处理这个信号多半是由收到信号的那个进程自行决定,除非收到的信号是SIGKILL之类只能采取默认行动的信号。Linux处理信号主要有下面4种方式:

(1)采用系统默认的处理方式。一般而言,进程对信号的默认处理方式都是终止运行。

(2)忽略该信号。

(3)暂时搁置该信号。

(4)由程序设计人员利用系统调用signal设定处理信号的函数。以下是一个例子:

  1. /*
  2. * signalHandler.ci
  3. *
  4. * Created on: Aug 4, 2013
  5. * Author: root
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <signal.h>
  10.  
  11. void initfunc(int signum);
  12. void exitfunc(int signum);
  13.  
  14. int main(){
  15. char buffer1[], buffer2[];
  16. int i;
  17. if(signal(SIGINT, &initfunc) == -){
  18. printf("Couldn't register signal handler for SIGINT!\n");
  19. exit();
  20. }
  21. if(signal(SIGTSTP, &initfunc) == -){
  22. printf("Couldn't register signal handler for SIGSTP!\n");
  23. exit();
  24. }
  25. if(signal(SIGTERM, &exitfunc) == -){
  26. printf("Couldn't register signal handler for SIGTERM!\n");
  27. exit();
  28. }
  29. printf("Pid of This Process: %d\n", getpid());
  30. for(;;){
  31. printf("Please input:\n");
  32. fgets(buffer1, sizeof(buffer1), stdin);
  33. for(i=;i<;i++){
  34. if(buffer1[i] >= && buffer1[i] <=){
  35. buffer2[i] = buffer1[i]-;
  36. }else{
  37. buffer2[i] = buffer1[i];
  38. }
  39. }
  40. printf("Your input is: %s\n", buffer2);
  41. }
  42. exit();
  43. }
  44.  
  45. void initfunc(int signum){
  46. printf("catch signal %d\n", signum);
  47. }
  48. void exitfunc(int signum){
  49. printf("signal SIGTERM\n");
  50. exit();
  51. }

程序的执行结果如下:

注:在一个终端中执行该程序时,按下Ctrl+Z, 会打印catch signal 20;按下Ctrl+C,会打印catch signal 2;在终端的另一个窗口中输入kill 2457,程序会打印signal SIGTERM,然后退出。

二、管道

管道,就是将一个进程的标准输出和另一个进程的标准输入联系到一起,以供两个进程相互通信的方法。管道是UNIX中最古老的进程通信机制,Linux中也提供了管道。它的应用非常广泛,就连Linux命令行中也有使用,例如:

这条命令中,ls的输出作为sort的输入,sort的输出又作为head -5的输入,head -5的输出将出现在屏幕上。这条命令的最终执行结果是将文件列表排序,但只输出前五行。从中可以直观地看到管道的特点。

Linux环境进程间通信----信号与管道的更多相关文章

  1. Linux环境进程间通信(一):管道及命名管道

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  2. <转>Linux环境进程间通信(二): 信号(上)

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 原文如下: 一.信号及信号来源 信号本质 信号是在软件层 ...

  3. Linux环境进程间通信(二): 信号(上)

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  4. Linux环境进程间通信(二): 信号--转载

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html http://www.ibm.com/developerworks ...

  5. Linux 环境进程间通信(六):

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  6. Linux环境进程间通信(四):信号灯

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  7. <转>Linux 环境进程间通信(六)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part6/ 一个套接口可以看作是进程间通信的端点(endpoint),每个套接口的名字都是唯一的(唯 ...

  8. Linux环境进程间通信: 共享内存

    Linux环境进程间通信: 共享内存 第一部分 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进 ...

  9. 《Linux环境进程间通信》系列文章链接

    深刻理解 Linux 进程间通信(IPC) http://www.ibm.com/developerworks/cn/linux/l-ipc/index.html Linux 环境进程间通信(一): ...

随机推荐

  1. 在ios微信中提交form,php端收不到参数的问题

    今天做h5页面时,微信浏览器中提交form表单,发现php端收不到post过来的参数,在普通浏览器中可以,安卓微信也可以,$_POST,$_GET,$_REQUEST等方式都不行. 后来,把form表 ...

  2. 集训队8月2日(BFS)

    看书情况:109~124页 刷题数:6 今天把上两次比赛的该补的题都补了,补题有博客,还写了两道书上例题的博客. 书上例题 BFS思维https://www.cnblogs.com/246247839 ...

  3. SQL语句之-通配符

    四.用通配符过滤数据 1.LIKE模糊搜索 2.%0个1个多个字符 SELECT * FROM products WHERE prod_name LIKE 'Fish%' 区分大小写,任意位置,任意次 ...

  4. PAT 1051 Pop Sequence (25 分)

    返回 1051 Pop Sequence (25 分)   Given a stack which can keep M numbers at most. Push N numbers in the ...

  5. layui弹出层回调的使用

    <%@page language="java" contentType="text/html; charset=UTF-8"%> <%@ in ...

  6. npm ERR! cb() never called! npm ERR! This is an error with npm itself. Pleas

    原因是:需要用管理员的身份才能进行 方法:点开始,找到命令提示符,右键,点以管理员的身份运行命令即可

  7. Python常用模块系列

    1.时间模块 import time,datetime # print(time.time()) #时间戳 # print(time.strftime("%Y-%m-%d %X") ...

  8. HTTP 请求及响应 (转)

    HTTP请求 4.1.HTTP请求包括的内容 客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求. 一个完整的HTTP请求包括如下内容:一个请求行.若干消息头. ...

  9. python- 粘包 struct,socketserver

    黏包 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), sh ...

  10. 18-vim-插入命令

    在vi中除了常用的i进入编辑模式外,还提供了以下命令同样可以进入编辑模式: 命令 英文 功能 使用频率 i insert 在当前字符前插入文本 常用 I insert 在行首插入文本 较常用 a ap ...