一、信号:

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

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

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

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

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

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

(2)忽略该信号。

(3)暂时搁置该信号。

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

/*
* signalHandler.ci
*
* Created on: Aug 4, 2013
* Author: root
*/ #include <stdio.h>
#include <signal.h> void initfunc(int signum);
void exitfunc(int signum); int main(){
char buffer1[], buffer2[];
int i;
if(signal(SIGINT, &initfunc) == -){
printf("Couldn't register signal handler for SIGINT!\n");
exit();
}
if(signal(SIGTSTP, &initfunc) == -){
printf("Couldn't register signal handler for SIGSTP!\n");
exit();
}
if(signal(SIGTERM, &exitfunc) == -){
printf("Couldn't register signal handler for SIGTERM!\n");
exit();
}
printf("Pid of This Process: %d\n", getpid());
for(;;){
printf("Please input:\n");
fgets(buffer1, sizeof(buffer1), stdin);
for(i=;i<;i++){
if(buffer1[i] >= && buffer1[i] <=){
buffer2[i] = buffer1[i]-;
}else{
buffer2[i] = buffer1[i];
}
}
printf("Your input is: %s\n", buffer2);
}
exit();
} void initfunc(int signum){
printf("catch signal %d\n", signum);
}
void exitfunc(int signum){
printf("signal SIGTERM\n");
exit();
}

程序的执行结果如下:

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

二、管道

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

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

最新文章

  1. Oracle:一个用户操作多个表空间中表的问题(转)
  2. web.Config配置数据库的连接
  3. TypeScript Handbook 1——基本类型(翻译)
  4. handlebars,each循环里面套each循环
  5. Java多线程系列--“JUC原子类”01之 框架
  6. springmvc中RedirectAttributes的作用
  7. 隐式调用 Intent 大全, 很全
  8. BZOJ2844: albus就是要第一个出场
  9. DDD:谈谈数据模型、领域模型、视图模型和命令模型
  10. Git初始化与上传
  11. iOS 获取当前媒体音量
  12. python 零散记录(一) input与raw_input 数学相关函数 转换字符串的方法
  13. LeetCode_Triangle
  14. 快速学习使用 Windows Azure 上的 SharePoint Server 2013
  15. python数据分析入门学习笔记
  16. 状态压缩- Brackets
  17. linkin大话数据结构--数组
  18. python自定义pi函数的代码
  19. 小程序坑之 swiper组件
  20. 你不可不知的Java引用类型【总结篇】

热门文章

  1. 【dart学习】-- Dart之异步编程
  2. sql中简单的触发器功能
  3. delphi xe 正则表达式
  4. linux之-mysql数据库2
  5. 【Java架构:基础技术】一篇文章搞掂:MyBatis
  6. 机器学习笔记--classification_report&amp;精确度/召回率/F1值
  7. C语言函数指针用法
  8. [轉]User namespaces – available to play!
  9. [JXOI2017]数列
  10. 使用 Audacity 录制声卡声音