`

进程间通信学习笔记一(管道通信)

 
阅读更多

进程间通信(ipc)


应用场景:
数据传输
资源共享
通知事件
进程控制


system v at&t system v
posix(portable operating system interface)可移植操作系统接口


常用的进程间通信的方式:
管道(pipe)和有名管道(fifo)
信号(signal)
消息队列
共享内存
信号量
套接字(socket)


管道通信
半双工的,数据只能向一个方向流动
只能用于父子进程间或兄弟进程间
先进先出,一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据


无名管道 用于父子进程间的通信


创建管道
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_fd<0){
printf("pipe create error\n");
return -1;
}else{
printf("pipe create success\n");
}
close(pipe_fd[0]);
close(pipe_fd[1]);
}


管道的读写
选创建一个管道,通过fork()函数创建一个子进程,子进程会继承父进程所创建的管道


示例代码如下:


#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>


int main(){
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char *p_wbuf;
int r_num;


memset(buf_r,0,sizeof(buf_r));


/*创建管道*/
if(pipe(pipe_fd)<0){
printf("create pipe error\n");
return -1;
}
/*创建子进程*/
if((pid=fork())==0){//子进程中运行
printf("\n");
close(pipe_fd[1]);
sleep(2);
if((r_num=read(pipe_fd[0],buf_r,100))>0){
printf("%d number read form the pipe is %s\n",r_num,buf_r);
}
close(pipe_fd[0]);
exit(0);
}
else if(pid>0){//父进程中运行
close(pipe_fd[0]);
if(write(pipe_fd[1],"hello",5)!=-1){
printf("parent write1 hello!\n");
}
if(write(pipe_fd[1]," pipe",5)!=-1){
printf("parent write2 page!\n");
}
close(pipe_fd[1]);
sleep(3);
waitpid(pid,NULL,0);
exit(0);
}
}


运行结果如下:
[retacn@localhost tmp]$ gcc pipe_rw.c -o pipe_rw
[retacn@localhost tmp]$ ./pipe_rw


parent write1 hello!
parent write2 page!
10 number read form the pipe is hello pipe



有名管道 用于运行于同一系统中的任意两个进程间的通信
fifo,与无命管道的区别是不相关的进程也能交换数据


建立命名管道
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname,mode_t mode)
pathname:fifo文件名
mode:属性


当使用open打开fifo文件时,O_NONBLOCK会产生以下影响
使用时,访问要求无法满足时不阻塞,立即返回,errno是enxio
不使用时,访问要求无法满足时进程将阻塞


示例代码如下:
fifo_read.c
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#define FIFO "/home/retacn/tmp/myfifo"


main(int argc,char *argv){
char buf_r[100];
int fd;
int nread;

/*创建管道*/
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=eexist)){
printf("cannot create fifoserver\n");
}
printf("preparing for reading bytes...\n");
memset(buf_r,0,sizeof(buf_r));

/*打开管道*/
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1){
perror("open");
exit(1);
}
while(1){
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){
if(errno==EAGAIN){
printf("no data yet\n");
}
}
printf("read %s form fifo\n",buf_r);
sleep(1);
}
/*暂停,等待信号*/
pause();
}


fifo_write.c
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#define FIFO_SERVER "/home/retacn/tmp/myfifo"


main(int argc,char **argv){
int fd;
char w_buf[100];
int nwrite;

/*打开管道*/
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);

if(argc==1){
printf("please send sonething\n");
exit(-1);
}
strcpy(w_buf,argv[1]);

/*向管道写入数据*/
if((nwrite=write(fd,w_buf,100))==-1){
if(errno==EAGAIN){
printf("the fifo has not been read yet,please try


later\n");
}
}else{
printf("write %s the fifo\n",w_buf);
}
}

分享到:
评论

相关推荐

    学习笔记信号量和进程间通信

    本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...

    MFC教程lesson 17-进程间通信.rar

    本教程聚焦于MFC中的一个重要概念——进程间通信(Inter-Process Communication,IPC)。进程间通信允许不同的进程之间交换数据,共享资源,协同工作,是Windows编程中的关键技能。Lesson 17的MFC教程将深入探讨这一...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十四)进程间通信(二)文章代码

    总的来说,该读书笔记覆盖了操作系统设计中的核心知识点——进程间通信,深入解析了各种通信机制的工作原理和实现方式,对于操作系统爱好者和开发者来说,是一份非常宝贵的参考资料。通过学习和实践,我们可以提高在...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十五)进程间通信(三)文章代码

    《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现,其中第25章专注于进程间通信的探讨,特别是第三部分。这里我们将结合书中的内容和提供的代码,详细解析这一关键知识点。 首先,...

    操作系统学习笔记

    管道是一种半双工的数据通信通道,允许两个进程通过共享内存区域交换数据,常用于实现简单的进程间通信或构建复杂的命令行管道。 综上所述,这份学习笔记全面覆盖了操作系统的核心概念,从底层的保护模式编程到高层...

    VC学习笔记之二:进程通信.doc

    - 邮槽是一种轻量级的进程间通信机制,适用于小数据量的传输。 5. **Windows套接字(Sockets)** - 主要用于网络通信,也可以用于本地进程间的通信。 #### 二、设置进程优先级 为了确保进程在执行时不会受到其他...

    Linux 进程 线程学习笔记

    Linux提供了多种机制来实现进程间通信(IPC),包括信号、管道、消息队列、共享内存和信号量等。 #### 线程管理 在Linux中,线程的创建和管理主要通过`pthread`库实现,其中`pthread_create()`用于创建新线程,`...

    操作系统学习笔记(三)1

    本文主要探讨了操作系统中的进程与线程,以及进程间通信的基础概念。 一、进程 进程是操作系统中运行程序的实例,它包含了程序的代码、数据、状态信息等。一个进程在某一时刻可能处于运行、就绪、阻塞三种状态之一...

    跨进程自学资料与笔记

    1. 进程间通信(IPC, Inter-Process Communication):这是跨进程的核心,包括管道、共享内存、消息队列、套接字、命名管道等多种方式。每种方式都有其适用场景和优缺点,需要根据实际需求选择。 2. 同步与互斥:当...

    linux编程学习笔记PDF资料下载.txt

    - **进程间通信(IPC)**:Linux提供了多种进程间通信机制,如管道、消息队列、共享内存、信号量等。 - **线程编程**:多线程编程可以利用多核处理器的并行计算能力,提高程序的执行效率。 - **同步与互斥**:为了...

    2019年软考系统架构设计师学习笔记.pdf

    进程间的同步和互斥是操作系统的重要概念,P/V操作是实现这两个概念的低级通信原语,用于控制对临界资源的访问。高级通信如共享存储、消息传递和管道通信则提供了更复杂的交互方式。 在处理机与进程管理部分,线程...

    linux学习笔记,我自己做的

    7. **进程管理**:包括进程查看(ps、top)、启动与停止进程(start、stop、kill命令),以及进程间通信。 8. **网络配置与管理**:涵盖网络接口配置、DNS解析、路由设置,以及网络服务如SSH、FTP的启用。 9. **...

    yzy第一次学习笔记作业

    * 进程通信:使用管道、信号、Socket 等方式实现进程间通信 五、Vim 编辑器 * Vim 编辑器的基本概念:命令模式、插入模式、末行模式 * Vim 编辑器的基本命令:i、a、o、w、q 等 * Vim 编辑器的高级功能:宏命令、...

    linux shell个人学习笔记,绝对极品

    最后,熟悉一些高级主题,如进程间通信(IPC,如管道、信号、共享内存和消息队列),以及如何利用cron服务定时执行任务,将让你的Linux技能更上一层楼。 总的来说,这份“Linux Shell个人学习笔记”涵盖了从基础...

    Unix c学习笔记汇总.zip

    6. **文件I/O和管道通信**:Unix的文件系统模型使得一切皆为文件,因此理解和掌握文件I/O操作是必要的。同时,笔记可能涉及到了进程间的通信机制,如管道、套接字等,这些都是Unix多进程编程的关键。 7. **编译和...

    linux c书本学习以及自己的学习笔记

    - 管道和FIFO:了解进程间通信(IPC)方式,如管道和命名管道(FIFO)的使用。 - 线程:掌握pthread库,包括线程的创建、同步和通信。 5. **信号处理**: - 信号:理解Linux中的信号机制,如何注册信号处理函数...

    Linux系统编程学习笔记

    - **管道**: 管道是一种进程间通信方式,允许一个进程的输出作为另一个进程的输入。 - **消息队列**: 消息队列是一种用于在进程间传递消息的机制。 - **信号量数组**: 信号量数组可以用于控制多个资源的访问。 - ...

    linux下C语言开发笔记整理

    进程间通信(IPC)允许独立的进程交换数据,常见的IPC方法包括管道(pipes)、消息队列、共享内存等。 ### Unix/Linux系统的网络编程 网络编程是Linux下C语言开发的核心内容之一,涉及套接字编程,用于实现网络...

    VC++深入学习笔记

    #### Lesson17: 进程间通信 - 进程之间通过管道、共享内存等方式交换数据。 #### Lesson18: ActiveX控件 - 创建和使用ActiveX控件,增强应用程序的功能。 #### Lesson19: 动态链接库DLL - 创建和使用动态链接库...

Global site tag (gtag.js) - Google Analytics