Linux学习(管道通信)
来源:互联网 发布:软件维护不能用 编辑:程序博客网 时间:2024/05/01 13:12
现在Linux使用的进程间通信方式包括:
1.管道(pipe)和有名管道(FIFO)
2.信号(signal)
3.消息队列
4.共享内存
5.信号量
6.套接字(socket)
管道通信:
管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。
数据被一个进程读出后,江背从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。
管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。
无名管道由pipe()函数创建:
int pipe(int filedis[2]);
当一个管道建立时,它会创建两个文件描述符:filedis[0]用于读管道,filedis[1]用于写管道。
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}
else
printf("pipe create success\n");
close(pipe_fd[0]);
close(pipe_fd[1]);
}
管道读写:
管道用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个字进程,该子进程会继承父进程所创建的管道。
注意事项:必须在系统调用fork()前调用pipe(),否则子进程不会继承文件描述符。
命名管道:
命名管道和无名管道基本相同,但也有不同点:无名管道只能由父子进程使用;但是通过命名管道,不相关的进程也能交换数据。
例:
#include <sys/types.h>
#include <sys/stat.h>
Int mkfifo(const char*pathname,mode_t mode);
Pathname:FIFO文件名
Mode:属性(见文件操作章节)
一旦创建了一个FIFO,就可用open打开它,一般的文件访问函数(close,read,write等)都可用于FIFO
信号通信:信号机制是Unix系统中最为古老的进程间通信机制,很多条件可用产生一个信号。
1.当用户按某些按键时,产生信号。
2.硬件异常产生信号:除数为0、无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。
3.进程用kill函数将信号发送给另一个进程。
4.用户可用Kill命令将信号发送给其他进程。
- Linux学习(管道通信)
- Linux进程入门学习(六)-管道通信
- linux管道通信(pipe)
- FIFO管道通信(linux)
- linux学习:进程间通信—管道
- Linux学习记录--有名管道通信
- linux 通信之无名管道学习
- linux进程间通信学习-管道
- Linux 进程通信学习1-管道
- Linux内核学习8:进程间通信(1)——基本概念与管道通信
- linux进程间通信之无名管道通信学习笔记
- linux进程间通信(一)管道和命名管道
- Linux--进程间通信(管道及有名管道FIFO)
- Linux--进程间通信(管道及有名管道FIFO)
- Linux--进程间通信(管道及有名管道FIFO)
- Linux通信机制(一) 无名管道与有名管道
- linux系统中的进程通信(管道和有名管道)
- linux C使用管道通信(一)
- (四)java多线程之ThreadLocal
- 欢迎使用CSDN-markdown编辑器
- (五)java多线程之Lock类
- 100个人回答五道试题,有81人答对第一题,91人答对第二题,85人答对第三题,79人答对
- 相关表格2
- Linux学习(管道通信)
- IOS10 调用相册,需要权限
- 坚持#第79天~不赖床不赖床,手机闹铃远离床,坚定决心去抗争!
- 多线程CUDA实例 167页 平方求和
- 如何实现iOS热更新
- Linux进程间通信——使用共享内存
- ubuntu下StartUML工具安装
- Android Studio直接运行影响启动性能
- Linux 进程通信之 共享内存