一、信号:

信号主要用来通知进程异步事件的发生。可以使用“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的输出将出现在屏幕上。这条命令的最终执行结果是将文件列表排序,但只输出前五行。从中可以直观地看到管道的特点。

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. 在不损坏数据的情况下调整分区大小(ext2\ext3\ext4)

    现在的时间是2017年5月27日 我想说调整分区大小没那么麻烦,至少我直接将一个ext3格式分区从50G减少到了30G. 步骤如下 1 首先确保那个分区是未挂载的. 2 调整分区大小,但是其实并没有实 ...

  2. 在 MacBook 上安装 Ubuntu

    建立ubuntu 安裝U盤,加入usb port,按住option key 開機,正常安裝. 完成後,會缺少wifi drive sudo apt-get install bcmwl-kernel-s ...

  3. django更换默认数据库sqlite3为pymsql后出现Keyerror:255的解决办法----升级PyMySQL

    一.更换数据库的办法: 1.安装PyMySQL 2.修改project目录同名文件下的settings.py:DATABASES = { 'default': { # 'ENGINE': 'djang ...

  4. MySQl 截取函数 left(),right(),substring(),substring_index() 的用法

    1. 字符串截取:left(str, length) mysql> select left('sqlstudy.com', 3); +-------------------------+ | l ...

  5. [STemWin教程入门篇]第二期:emWin5.xx的详细移植步骤

    转自:http://bbs.armfly.com/read.php?tid=1545 重要说明:(0)由于这个移植教程是去年过年的时候做的,用的是5.16,这就不再做个5.20的移植了,方法是一样的. ...

  6. strlen、strcmp、strcat、strlen、memmove

    #include <cassert> #include <iostream> using namespace std; /* strlen 返回字符串不包含结束符\0的长度 * ...

  7. Oracle 用户概念与基本操作

    目录 目录 Oracle的用户 通过系统用户来登陆SQLPlus system和sys的区别 查看登陆的用户 启用和锁定一个用户 启用用户 锁定用户 创建用户 修改用户 删除用户 角色权限 常用的用户 ...

  8. 2019山东省ACM省赛菜鸡的赛后总结

    省赛总结 2019-05-13 21:27:40 虽然第一次就死的这么难看,但是的确发现了很多问题,我想这是未来我和我的队友要解决的,而不是去难过,去感慨自己是有多菜.在大一训练结束马上参加暑假集训的 ...

  9. 转 Nginx Access Log日志统计分析常用命令

    Nginx Access Log日志统计分析常用命令Nginx Access Log日志统计分析常用命令IP相关统计 统计IP访问量 awk '{print $1}' access.log | sor ...

  10. 二、检索语句 SELECT、ORDER BY、WHERE

    介绍如何使用SELECT语句从表中检索一个或多个数据列   第二章: SELECT语句 SQL语句可以在一行给出,也可以分成许多行,分成多行更容易调试. 多条SQL语句必须以分号 分隔.多数DBMS不 ...