`

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接受到管道信息写文件

    华清远见嵌入式linux应用程序开发技术详解下载(内部资料).rar

     8.1 Linux下进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验内容   本章小结   思考与练习 第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用...

    linux内核源代码情景分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用...

    linux 内核源代码分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章 基于socket的进程间通信 ...

    嵌入式Linux应用程序开发标准教程(第2版全)

    接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...

    Linux内核情景分析(非扫描版)

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...

    Linux内核情景分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...

    嵌入式Linux C编程入门(第2版) PPT

    10.3 arm linux进程间通信api 301 10.3.1 管道通信 301 10.3.2 信号通信 303 10.3.3 共享内存 308 10.3.4 消息队列 309 10.4 arm linux线程相关api 312 10.5 linux守护进程 317 10.5.1 守护...

    边干边学Linux__第二版_doc格式

    16.1 进程间通信和共享内存 16.2 共享内存的API 16.3 共享内存在Linux中的实现 第17章 同步机制 17.1 同步机制 17.2 Linux中几种同步机制的实现 17.3 设计我们自己的同步机制 第18章 文件系统 18.1 文件系统基本...

    嵌入式Linux应用程序开发详解

    8.1 Linux下进程间通信概述 240 8.2 管道通信 241 8.2.1 管道概述 241 8.2.2 管道创建与关闭 242 8.2.3 管道读写 244 8.2.4 标准流管道 246 8.2.5 FIFO 249 8.3 信号通信 253 8.3.1 信号...

    UNIX高级编程 计算机科学丛书

    5. IPC——进程间通信(第十四、十五章)。 6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并...

    Linux程序设计 第4版.haozip01

    第13章 进程间通信:管道 443 13.1 什么是管道 443 13.2 进程管道 444 13.3 将输出送往popen 445 13.3.1 传递更多的数据 446 13.3.2 如何实现popen 447 13.4 pipe调用 449 13.5 父进程和子进程 451 13.5.1 ...

    Linux程序设计 第4版.haozip02

    第13章 进程间通信:管道 443 13.1 什么是管道 443 13.2 进程管道 444 13.3 将输出送往popen 445 13.3.1 传递更多的数据 446 13.3.2 如何实现popen 447 13.4 pipe调用 449 13.5 父进程和子进程 451 13.5.1 ...

Global site tag (gtag.js) - Google Analytics