linux进程间通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当使用半双工管道时,任何关联的进程都必须 共享一个相关的祖先进程。因为管道存在于系统 内核之中,所以任何不在创建管道的进程的祖先 进程之中的进程都将无法寻址它。而在命名管道 中却不是这样。
11
CHENLI 2021/3/7
2.4 标准流管道
与linux中文件操作有文件流的标准I/O一样,管道的操作 也支持基于文件流的模式。接口函数如下
4
CHENLI 2021/3/7
2、管道通信
普通的Linux shell都允许重定向,而重定向使用的就是 管道。例如:
ps | grep vsftpd
管道是单向的、先进先出的、无结构的、固定大小的字 节流,它把一个进程的标准输出和另一个进程的标准输入 连接在一起。写进程在管道的尾端写入数据,读进程在管 道的首端读出数据。数据读出后将从管道中移走,其它读 进程都不能再读到这些数据。管道提供了简单的流控制机 制。进程试图读空管道时,在有数据写入管道前,进程将 一直阻塞。同样,管道已经满时,进程再试图写管道,在 其它进程从管道中移走数据之前,写进程将一直阻塞。
系统调用:pipe( );
原型:int pipe(int fd[2]);
返回值:如果系统调用成功,返回0。如果系统调用失 败返回- 1:
errno = EMFILE (没有空闲的文件描述符)
EMFILE (系统文件表已满)
EFAULT (fd数组无效)
6
CHENLI 2021/3/7
注意:fd[0] 用于读取管道,fd[1] 用于写入管 道。
图1 linux中管道与文件描述符的关系
7
CHENLI 2021/3/7
#include <unistd.h> #include <errno.h> #include <stdio.h> #include <stdlib.h>
int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0){
图2 父子进程管道的文件描述符对应关系
9
CHENLI 2021/3/7
子进程写入和父进程读的命名管道:
图 3 关闭父进程fd[1] 和 子进程[0]
10
CHENLI 2021/3/7
2.3 管道读写注意事项
可以通过打开两个管道来创建一个双向的管道。 但需要在子进程中正确地设置文件描述符。
必须在系统调用fork( )中调用pipe( ),否则子进 程将不会继承文件描述符。
库函数:popen();
原型: FILE *popen ( char *command, char *type);
返回值:如果成功,返回一个新的文件流。如果无法 创建进程或者管道,返回NULL。
管道中数据流的方向是由第二个参数type控制的。此参 数可以是r或者w,分别代表读或写。但不能同时为读和写。 在Linux系统下,管道将会以参数type中第一个字符代表的 方式打开。所以,如果你在参数type中写入rw,管道将会 以读的方式打开。
2
CHENLI 2021/3/7
linux进程间通信(IPC)由以下几部分发展而来:
早期UNIX进程间通信、基于System V进程间通信、 基于Socket进程间通信和POSIX进程间通信。
UNIX进程间通信方式包括:管道、FIFO、信号。
System V进程间通信方式包括:System V消息队 列、System V信号灯、System V共享内存。
13
CHENLI 2021/3/7
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
管道主要用于不同进程间通信。
5
CHENLI 2021/3/7
2.1 管道创建与关闭
创建一个简单的管道,可以使用系统调用pipe( )。它接 受一个参数,也就是一个包括两个整数的数组。如果系统 调用成功,此数组将包括管道使用的两个文件描述符。创 建一个管道之后,一般情况下进程将产生一个新的进程。
POSIX进程间通信包括:posix消息队列、posix信 号灯、posix共享内存。
3
CHENLI 2021/3/7
现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket)
printf("pipe create error\n");
return -1;
}
else
printf("pipe create success\Fra Baidu bibliotek");
close(pipe_fd[0]);
close(pipe_fd[1]);
}
8
CHENLI 2021/3/7
2.2 管道读写
管道主要用于不同进程间通信。实际上,通常先创建一 个管道,再通过fork函数创建一个子进程。
12
CHENLI 2021/3/7
使用popen()创建的管道必须使用pclose( )关闭。其实, popen/pclose和标准文件输入/输出流中的fopen()/fclose() 十分相似。
库函数:pclose();
原型:int pclose( FILE *stream );
返回值:返回调用状态。
linux进程间通信
1. 进程间通信概述 2. 管道通信 3. 信号 4. 共享内存 5. 消息队列
1
CHENLI 2021/3/7
1、进程间通信概述
进程间通信有如下一些目的: 数据传输:一个进程需要将它的数据发送给另一个进程,
发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享
数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,
通知它(它们)发生了某种事件(如进程终止时要通知父 进程)。 资源共享:多个进程之间共享同样的资源。为了作到这一 点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行(如 Debug进程),此时控制进程希望能够拦截另一个进程的 所有陷入和异常,并能够及时知道它的状态改变。
11
CHENLI 2021/3/7
2.4 标准流管道
与linux中文件操作有文件流的标准I/O一样,管道的操作 也支持基于文件流的模式。接口函数如下
4
CHENLI 2021/3/7
2、管道通信
普通的Linux shell都允许重定向,而重定向使用的就是 管道。例如:
ps | grep vsftpd
管道是单向的、先进先出的、无结构的、固定大小的字 节流,它把一个进程的标准输出和另一个进程的标准输入 连接在一起。写进程在管道的尾端写入数据,读进程在管 道的首端读出数据。数据读出后将从管道中移走,其它读 进程都不能再读到这些数据。管道提供了简单的流控制机 制。进程试图读空管道时,在有数据写入管道前,进程将 一直阻塞。同样,管道已经满时,进程再试图写管道,在 其它进程从管道中移走数据之前,写进程将一直阻塞。
系统调用:pipe( );
原型:int pipe(int fd[2]);
返回值:如果系统调用成功,返回0。如果系统调用失 败返回- 1:
errno = EMFILE (没有空闲的文件描述符)
EMFILE (系统文件表已满)
EFAULT (fd数组无效)
6
CHENLI 2021/3/7
注意:fd[0] 用于读取管道,fd[1] 用于写入管 道。
图1 linux中管道与文件描述符的关系
7
CHENLI 2021/3/7
#include <unistd.h> #include <errno.h> #include <stdio.h> #include <stdlib.h>
int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0){
图2 父子进程管道的文件描述符对应关系
9
CHENLI 2021/3/7
子进程写入和父进程读的命名管道:
图 3 关闭父进程fd[1] 和 子进程[0]
10
CHENLI 2021/3/7
2.3 管道读写注意事项
可以通过打开两个管道来创建一个双向的管道。 但需要在子进程中正确地设置文件描述符。
必须在系统调用fork( )中调用pipe( ),否则子进 程将不会继承文件描述符。
库函数:popen();
原型: FILE *popen ( char *command, char *type);
返回值:如果成功,返回一个新的文件流。如果无法 创建进程或者管道,返回NULL。
管道中数据流的方向是由第二个参数type控制的。此参 数可以是r或者w,分别代表读或写。但不能同时为读和写。 在Linux系统下,管道将会以参数type中第一个字符代表的 方式打开。所以,如果你在参数type中写入rw,管道将会 以读的方式打开。
2
CHENLI 2021/3/7
linux进程间通信(IPC)由以下几部分发展而来:
早期UNIX进程间通信、基于System V进程间通信、 基于Socket进程间通信和POSIX进程间通信。
UNIX进程间通信方式包括:管道、FIFO、信号。
System V进程间通信方式包括:System V消息队 列、System V信号灯、System V共享内存。
13
CHENLI 2021/3/7
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
管道主要用于不同进程间通信。
5
CHENLI 2021/3/7
2.1 管道创建与关闭
创建一个简单的管道,可以使用系统调用pipe( )。它接 受一个参数,也就是一个包括两个整数的数组。如果系统 调用成功,此数组将包括管道使用的两个文件描述符。创 建一个管道之后,一般情况下进程将产生一个新的进程。
POSIX进程间通信包括:posix消息队列、posix信 号灯、posix共享内存。
3
CHENLI 2021/3/7
现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket)
printf("pipe create error\n");
return -1;
}
else
printf("pipe create success\Fra Baidu bibliotek");
close(pipe_fd[0]);
close(pipe_fd[1]);
}
8
CHENLI 2021/3/7
2.2 管道读写
管道主要用于不同进程间通信。实际上,通常先创建一 个管道,再通过fork函数创建一个子进程。
12
CHENLI 2021/3/7
使用popen()创建的管道必须使用pclose( )关闭。其实, popen/pclose和标准文件输入/输出流中的fopen()/fclose() 十分相似。
库函数:pclose();
原型:int pclose( FILE *stream );
返回值:返回调用状态。
linux进程间通信
1. 进程间通信概述 2. 管道通信 3. 信号 4. 共享内存 5. 消息队列
1
CHENLI 2021/3/7
1、进程间通信概述
进程间通信有如下一些目的: 数据传输:一个进程需要将它的数据发送给另一个进程,
发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享
数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,
通知它(它们)发生了某种事件(如进程终止时要通知父 进程)。 资源共享:多个进程之间共享同样的资源。为了作到这一 点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行(如 Debug进程),此时控制进程希望能够拦截另一个进程的 所有陷入和异常,并能够及时知道它的状态改变。