`

C语言进程间通信(一)——管道

阅读更多

 

进程间通信(IPC)是指在不同进程之间传递信息。linux的进程通信方式有管道,消息队列,信号量,共享内存,套接口等方式,下面一一整理。

首先是管道(PIPE),管道是Unix系统IPC最古老的方式,所有的Unix系统都提供这种通信机制。它的优点在于简单易用,缺点在于有限制,详细见下面几点:

 

  • 只能用于父子进程或兄弟进程之间通信
  • 大多数系统中都是半双工的,数据信息只能单向流动,如果需要双向通信则需要建立两个管道
  • 传输的是无格式字节流,需要双方约定格式
  • 管道缓冲区是有限的,等等
首先来看父子进程之间通信的例子。
#include<stdio.h>
#include<limits.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>

#define BUFSIZE PIPE_BUF  //管道默认一次性读取的数据长度

void err_quit(char *err) {
        printf("%s\n",err);
        exit(-1);
}

int main()
{
        int fd[2];
        char buf[BUFSIZE] = "hello my son";
        pid_t pid;

        if (pipe(fd) < 0) {
                err_quit("pipe error");
        }
        if ((pid = fork()) < 0) {
                err_quit("fork error");
        }
        else if(pid > 0) { //父进程
                close(fd[0]);
                write(fd[1], buf, strlen(buf));
        }
        else {
                close(fd[1]);
                int len = read(fd[0], buf, BUFSIZE);
                if (len < 0) {
                        err_quit("read error");
                }
                printf("Get : %s\n",buf);
        }
        return 0;
}
 接下来是兄弟进程之间通信的例子。
#include<stdio.h>
#include<limits.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>

#define BUFSIZE PIPE_BUF  //管道默认一次性读取的数据长度

void err_quit(char *err) {
	printf("%s\n",err);
	exit(-1);
}

int main()
{
	int fd[2];
	char buf[BUFSIZE] = "hello my brother";
	pid_t pid;

	if (pipe(fd) < 0) {
		err_quit("pipe error");
	}
	if ((pid = fork()) < 0) {
		err_quit("fork error");
	}
	else if(pid > 0) { //父进程

		if ((pid = fork()) < 0) {
			err_quit("fork error");
		}
		else if (pid > 0) { //父进程

		}
		else {
			close(fd[0]);
			write(fd[1], buf, strlen(buf));
		}
	}
	else {
		close(fd[1]);
		int len = read(fd[0], buf, BUFSIZE);
		if (len < 0) {
			err_quit("read error");
		}
		printf("Get : %s\n",buf);
	}
	return 0;
}
 代码都很简单,只是需要记住在创建新进程后记得分别关闭读写描述符。如果想让子进程给父进程传递数据,则关闭父进程的写描述符和子进程的读描述符即可。利用管道可以做简单的进程同步工作,因为读端会一直阻塞到写端发出数据后再运行后面的代码,可以利用这个特点保证让指定的进程先运行。
分享到:
评论

相关推荐

    进程间通信——管道

    c语言实现的进程间通信,通信方式用管道,write接受到管道信息写文件

    进程间通信之消息队列 ( message queue )——完整代码

    进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....

    实验一-进程通信——管道和信号实验报告.doc

    ### 实验一 进程通信——管道和信号实验报告 #### 实验背景及目标 本实验旨在通过实际操作深入理解进程通信的相关概念和技术,特别是管道和信号这两种进程间通信方式。实验目标具体包括: 1. **加深对进程概念的...

    C语言也能干大事——全集下载地址

    进程间通信(IPC)是多进程环境下必不可少的技术之一。这部分可能介绍了管道、信号量、共享内存等IPC机制。 #### 高级算法 在算法基础之上,这部分内容可能会进一步探讨更复杂的数据处理技术,例如图论算法(如...

    基于C语言多进程通信的银行ATM系统,分为客户端和服务器端。.zip

    通过理解和掌握这个项目,我们可以深入理解C语言的多进程编程以及进程间通信的机制。 首先,我们要了解C语言在多进程编程中的基本概念。C语言提供了创建、管理进程的系统调用,如`fork()`用于创建子进程,`exec()`...

    Linux系统编程实验六进程间通信.docx

    首先,我们关注的是进程间通信的一个常见方法——管道(Pipe)。管道是一种半双工通信方式,允许数据在一个方向上流动。在实验中,我们使用`pipe()`函数创建了一个管道。`pipe()`函数接受一个整型数组`filedes[2]`...

    驱动程序问题——管道驱动程序开发1

    【管道驱动程序开发】在操作系统中,管道是一种重要的进程间通信(IPC)机制,它允许进程之间通过字节流方式交换信息。在Linux系统中,管道的实现涉及到内核空间的操作,因此通常需要通过设备驱动程序来管理。本文将...

    LINUX进程间通信:PIPE与FIFO - 山 人 - 博客园1

    管道(包括无名管道和命名管道)为进程间通信提供了一种简单而有效的方式。通过合理地选择和使用这些机制,可以极大地提高程序的设计灵活性和性能效率。无论是简单的父子进程通信还是更复杂的多进程数据交换场景,...

    实验四-进程间管道通信.doc

    本实验旨在通过具体的编程实践,加深学生对进程间通信(IPC)机制之一——管道通信的理解与掌握。实验中,参与者将学习如何利用系统调用`pipe()`、`close()`、`write()`以及`read()`来实现父子进程之间的数据传输。 ...

    用linux语言编程的管道通信程序

    标题中的“用Linux语言编程的管道通信程序”指的是在Linux操作系统环境下,利用C语言或者其他支持系统调用的编程语言,实现进程间通信的一种方法——管道通信。管道是Linux提供的一种简单且有效的方式,允许不同进程...

    Linux下C语言编程——文件

    管道文件用于进程间通信。`pipe()`函数创建一个管道,返回两个文件描述符,一个用于写入,一个用于读取。例如,`pipe(fd)`创建管道后,`fd[0]`用于读,`fd[1]`用于写。 总结来说,Linux下的C语言编程中,文件操作...

    验五:进程的管道通信

    本实验旨在通过实践操作,帮助学习者深入了解进程间通信的基本原理和技术之一——管道通信。管道是一种用于连接进程的标准输入输出流,允许一个进程(通常称为生产者)写入数据,另一个进程(通常称为消费者)读取...

    linux进程及进程间通讯

    4. **信号**:信号是一种进程间通信方式,用于通知进程发生了某个事件。 #### 进程间通信(IPC) 进程间通信(Inter-Process Communication, IPC)是指不同进程之间交换数据或协调彼此行为的方式。Linux提供了多种...

    操作系统----进程管理及进程通信实验报告

    同时,也学习了进程间如何通过管道进行通信,这对于实现分布式系统、多线程编程和并发操作有重要意义。实验报告的最后部分,要求学生根据实验结果撰写实验心得,这有助于巩固理论知识,并培养问题解决和分析能力。

    Linux下C语言中的多进程编程资料

    通常用于临时性的进程间通信。 ##### 2. 信号量 信号量是一种可以多进程共享的变量,用于解决进程间的同步问题,防止数据访问冲突。 ##### 3. 共享内存 共享内存使得多个进程可以访问同一块内存区域,是最快的...

    FIFO管道命名实验

    本实验“FIFO管道命名实验”聚焦于一种特定的进程间通信(IPC)方式——命名管道(Named Pipe),也称为FIFO(先进先出)文件。下面我们将深入探讨命名管道的概念、工作原理以及如何通过C语言实现。 命名管道是Unix...

    Linux学习宝典——一本好书

    4. 进程间通信:了解管道、消息队列、共享内存、套接字等进程间通信方式。 七、系统安全与防火墙 1. SSH安全:学会配置SSH服务,提高远程登录的安全性。 2. 权限策略:设置sudo,实现非root用户的权限控制。 3. ...

Global site tag (gtag.js) - Google Analytics