linux管道pipe详解

Linux 进程间通信 pipe 实现原理 本文基于 Linux-5.10 版本分析,借助 pipe 分析等待队列,为了下篇文章分析 slect/poll/epoll 实现做准备。pipe 是 Linux 系统中一种比较常用的进程间通信方法,不过使用 pipe 通信的两个进行必须有亲属关系,通常是父子进程。pipe 和 pipe2 返回成功时,pipefd 保存两个文件描述符:pipefd[0] 用于读,pipefd[1] 用于写。 阅读详情

管道

管道的概念:

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:

1. 其本质是一个伪文件(实为内核缓冲区)

2. 由两个文件描述符引用,一个表示读端,一个表示写端。

3. 规定数据从管道的写端流入管道,从读端流出。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

管道的局限性:

① 数据自己读不能自己写。

② 数据一旦被读走,便不在管道中存在,不可反复读取。

③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

④ 只能在有公共祖先的进程间使用管道。

常见的通信方式有,单工通信、半双工通信、全双工通信。

pipe函数

创建管道

    int pipe(int pipefd[2]); 成功:0;失败:-1,设置errno

函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。

管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?通常可以采用如下步骤:

 

1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端。

2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。

3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以向管道中写入数据,子进程将管道中的数据读出。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。

    练习:父子进程使用管道通信,父写入字符串,子进程读出并,打印到屏幕。 【pipe.c】

思考:为甚么,程序中没有使用sleep函数,但依然能保证子进程运行时一定会读到数据呢?

  1. #include <unistd.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <stdio.h>  
  5. #include <sys/wait.h>  
  6.   
  7. void sys_err(const char *str)  
  8. {  
  9.     perror(str);  
  10.     exit(1);  
  11. }  
  12.   
  13. int main(void)  
  14. {  
  15.     pid_t pid;  
  16.     char buf[1024];  
  17.     int fd[2];  
  18.     char *p = "test for pipe\n";  
  19.       
  20.    if (pipe(fd) == -1)   
  21.        sys_err("pipe");  
  22.   
  23.    pid = fork();  
  24.    if (pid < 0) {  
  25.        sys_err("fork err");  
  26.    } else if (pid == 0) {  
  27.         close(fd[1]);  
  28.         int len = read(fd[0], buf, sizeof(buf));  
  29.         write(STDOUT_FILENO, buf, len);  
  30.         close(fd[0]);  
  31.    } else {  
  32.        close(fd[0]);  
  33.        write(fd[1], p, strlen(p));  
  34.        wait(NULL);  
  35.        close(fd[1]);  
  36.    }  
  37.       
  38.     return 0;  
  39. }  
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

void sys_err(const char *str)
{
    perror(str);
    exit(1);
}

int main(void)
{
    pid_t pid;
    char buf[1024];
    int fd[2];
    char *p = "test for pipe\n";
    
   if (pipe(fd) == -1) 
       sys_err("pipe");

   pid = fork();
   if (pid < 0) {
       sys_err("fork err");
   } else if (pid == 0) {
        close(fd[1]);
        int len = read(fd[0], buf, sizeof(buf));
        write(STDOUT_FILENO, buf, len);
        close(fd[0]);
   } else {
       close(fd[0]);
       write(fd[1], p, strlen(p));
       wait(NULL);
       close(fd[1]);
   }
    
    return 0;
}


管道的读写行为

    使用管道需要注意以下4种特殊情况(假设都是阻塞I/O操作,没有设置O_NONBLOCK标志):

1. 如果所有指向管道写端的文件描述符都关闭了(管道写端引用计数为0),而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。

2. 如果有指向管道写端的文件描述符没关闭(管道写端引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。

3. 如果所有指向管道读端的文件描述符都关闭了(管道读端引用计数为0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。当然也可以对SIGPIPE信号实施捕捉,不终止进程。具体方法信号章节详细介绍。

4. 如果有指向管道读端的文件描述符没关闭(管道读端引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。

总结:

① 读管道: 1. 管道中有数据,read返回实际读到的字节数。

2. 管道中无数据:

(1) 管道写端被全部关闭,read返回0 (好像读到文件结尾)

  (2) 写端没有全部被关闭,read阻塞等待(不久的将来可能有数据递达,此时会让出cpu)

    ② 写管道: 1. 管道读端全部被关闭, 进程异常终止(也可使用捕捉SIGPIPE信号,使进程不终止)

2. 管道读端没有全部关闭:

(1) 管道已满,write阻塞。

(2) 管道未满,write将数据写入,并返回实际写入的字节数。

    练习:使用管道实现父子进程间通信,完成:ls | wc –l。假定父进程实现ls,子进程实现wc。

ls命令正常会将结果集写出到stdout,但现在会写入管道的写端;wc –l 正常应该从stdin读取数据,但此时会从管道的读端读。      【pipe1.c】

  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. #include <sys/wait.h>  
  4.   
  5. int main(void)  
  6. {  
  7.     pid_t pid;  
  8.     int fd[2];  
  9.   
  10.     pipe(fd);  
  11.     pid = fork();  
  12.   
  13.     if (pid == 0) {  //child  
  14.         close(fd[1]);                   //子进程从管道中读数据,关闭写端  
  15.         dup2(fd[0], STDIN_FILENO);      //让wc从管道中读取数据  
  16.         execlp("wc", "wc", "-l", NULL); //wc命令默认从标准读入取数据  
  17.   
  18.     } else {  
  19.   
  20.         close(fd[0]);   //父进程向管道中写数据,关闭读端  
  21.         dup2(fd[1], STDOUT_FILENO);     //将ls的结果写入管道中  
  22.         execlp("ls", "ls", NULL);       //ls输出结果默认对应屏幕  
  23.     }  
  24.   
  25.     return 0;  
  26. }  
  27.   
  28.   
  29.   
  30.   
  31.   
  32. /* 
  33.  *  程序不时的会出现先打印$提示符,再出程序运行结果的现象。 
  34.  *  这是因为:父进程执行ls命令,将输出结果给通过管道传递给 
  35.  *  子进程去执行wc命令,这时父进程若先于子进程打印wc运行结果 
  36.  *  之前被shell使用wait函数成功回收,shell就会先于子进程打印 
  37.  *  wc运行结果之前打印$提示符。 
  38.  *  解决方法:让子进程执行ls,父进程执行wc命令。或者在兄弟进程间完成。 
  39.  */  
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
	pid_t pid;
	int fd[2];

	pipe(fd);
	pid = fork();

	if (pid == 0) {  //child
		close(fd[1]);	                //子进程从管道中读数据,关闭写端
		dup2(fd[0], STDIN_FILENO);		//让wc从管道中读取数据
		execlp("wc", "wc", "-l", NULL);	//wc命令默认从标准读入取数据

	} else {

		close(fd[0]);	//父进程向管道中写数据,关闭读端
		dup2(fd[1], STDOUT_FILENO);		//将ls的结果写入管道中
		execlp("ls", "ls", NULL);		//ls输出结果默认对应屏幕
	}

	return 0;
}





/*
 *  程序不时的会出现先打印$提示符,再出程序运行结果的现象。
 *  这是因为:父进程执行ls命令,将输出结果给通过管道传递给
 *  子进程去执行wc命令,这时父进程若先于子进程打印wc运行结果
 *  之前被shell使用wait函数成功回收,shell就会先于子进程打印
 *  wc运行结果之前打印$提示符。
 *  解决方法:让子进程执行ls,父进程执行wc命令。或者在兄弟进程间完成。
 */



程序执行,发现程序执行结束,shell还在阻塞等待用户输入。这是因为,shell → fork → ./pipe1, 程序pipe1的子进程将stdin重定向给管道,父进程执行的ls会将结果集通过管道写给子进程。若父进程在子进程打印wc的结果到屏幕之前被shell调用wait回收,shell就会先输出$提示符。

    练习:使用管道实现兄弟进程间通信。 兄:ls  弟: wc -l  父:等待回收子进程。

要求,使用“循环创建N个子进程”模型创建兄弟进程,使用循环因子i标示。注意管道读写行为。 【pipe2.c】

  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. #include <sys/wait.h>  
  4.   
  5. int main(void)  
  6. {  
  7.     pid_t pid;  
  8.     int fd[2], i;  
  9.       
  10.     pipe(fd);  
  11.   
  12.     for (i = 0; i < 2; i++) {  
  13.         if((pid = fork()) == 0) {  
  14.             break;  
  15.         }  
  16.     }  
  17.   
  18.     if (i == 0) {           //兄  
  19.         close(fd[0]);               //写,关闭读端  
  20.         dup2(fd[1], STDOUT_FILENO);       
  21.         execlp("ls", "ls", NULL);     
  22.     } else if (i == 1) {    //弟  
  23.         close(fd[1]);               //读,关闭写端  
  24.         dup2(fd[0], STDIN_FILENO);        
  25.         execlp("wc", "wc", "-l", NULL);       
  26.     } else {  
  27.         close(fd[0]);  
  28.         close(fd[1]);  
  29.         for(i = 0; i < 2; i++)       //两个儿子wait两次  
  30.             wait(NULL);  
  31.     }  
  32.   
  33.     return 0;  
  34. }  
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
	pid_t pid;
	int fd[2], i;
	
	pipe(fd);

	for (i = 0; i < 2; i++) {
		if((pid = fork()) == 0) {
			break;
        }
    }

	if (i == 0) {			//兄
		close(fd[0]);				//写,关闭读端
		dup2(fd[1], STDOUT_FILENO);		
		execlp("ls", "ls", NULL);	
	} else if (i == 1) {	//弟
		close(fd[1]);				//读,关闭写端
		dup2(fd[0], STDIN_FILENO);		
		execlp("wc", "wc", "-l", NULL);		
	} else {
        close(fd[0]);
        close(fd[1]);
		for(i = 0; i < 2; i++)		//两个儿子wait两次
			wait(NULL);
	}

	return 0;
}


    测试:是否允许,一个pipe有一个写端,多个读端呢?是否允许有一个读端多个写端呢? 【pipe3.c】

  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. #include <sys/wait.h>  
  4. #include <string.h>  
  5. #include <stdlib.h>  
  6.   
  7. int main(void)  
  8. {  
  9.     pid_t pid;  
  10.     int fd[2], i, n;  
  11.     char buf[1024];  
  12.   
  13.     int ret = pipe(fd);  
  14.     if(ret == -1){  
  15.         perror("pipe error");  
  16.         exit(1);  
  17.     }  
  18.   
  19.     for(i = 0; i < 2; i++){  
  20.         if((pid = fork()) == 0)  
  21.             break;  
  22.         else if(pid == -1){  
  23.             perror("pipe error");  
  24.             exit(1);  
  25.         }  
  26.     }  
  27.   
  28.     if (i == 0) {             
  29.         close(fd[0]);                 
  30.         write(fd[1], "1.hello\n", strlen("1.hello\n"));  
  31.     } else if(i == 1) {   
  32.         close(fd[0]);                 
  33.         write(fd[1], "2.world\n", strlen("2.world\n"));  
  34.     } else {  
  35.         close(fd[1]);       //父进程关闭写端,留读端读取数据      
  36. //      sleep(1);  
  37.         n = read(fd[0], buf, 1024);     //从管道中读数据  
  38.         write(STDOUT_FILENO, buf, n);  
  39.   
  40.         for(i = 0; i < 2; i++)       //两个儿子wait两次  
  41.             wait(NULL);  
  42.     }  
  43.   
  44.     return 0;  
  45. }  
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
	pid_t pid;
	int fd[2], i, n;
	char buf[1024];

	int ret = pipe(fd);
	if(ret == -1){
		perror("pipe error");
		exit(1);
	}

	for(i = 0; i < 2; i++){
		if((pid = fork()) == 0)
			break;
		else if(pid == -1){
			perror("pipe error");
			exit(1);
		}
	}

	if (i == 0) {			
		close(fd[0]);				
		write(fd[1], "1.hello\n", strlen("1.hello\n"));
	} else if(i == 1) {	
		close(fd[0]);				
		write(fd[1], "2.world\n", strlen("2.world\n"));
	} else {
		close(fd[1]);       //父进程关闭写端,留读端读取数据    
//		sleep(1);
		n = read(fd[0], buf, 1024);     //从管道中读数据
		write(STDOUT_FILENO, buf, n);

		for(i = 0; i < 2; i++)		//两个儿子wait两次
			wait(NULL);
	}

	return 0;
}


Linux进程间通信(管道) 来讲一下这个代码的大致方向,第一部肯定是创建管道,然后就是创建子进程,这里我们是让父进程写子进程读,所以关闭父子进程不需要的fd,写入的一方,fd没有关闭,如果有数据,就读,没有数据就等,写入的一方,fd关闭, 读取的一方,read会返回0,表示读到了文件的结尾,最后关闭父子进程fd,回收子进程。总结管道的特点,理解以前的管道 | ,管道是一个文件–读取–具有访问控制,显示器也是一个文件,父子同时往显示器写入的时候,有没有说一个会等另一个的情况呢,缺乏访问控制。管道是Unix中最古老的进程间通信的形式。 阅读详情

相关推荐

匿名管道 Linux

整理一下控制代码,这里是输入型参数,只需要读这样就可以轮询方式选择进程了,不用随机了结果。

ljw的博客 2711

【Linux系统编程】管道pipe详解

本文将**详细**介绍管道相关的知识,包括**管道的基本原理、使用方法、管道类型、管道的应用场景以及管道的注意事项**等。

cheng_lin0201的博客 6511

Linux 之 pipe管道

Linux 之 pipe管道 前言 Linux下有很多IPC机制,pipe管道就是其中的一种。 正文 管道的概念 pipe被称为无名管道,用于亲缘进程间的通信。pipe管道实质为一个内核维护的环形队列,缓冲区大小为4K。工作方式为半双工通信。调用 pipe函数可以创建一个管道。 函数原型: #include <unistd.h> int pipe(int fd[2]); 管道有读写两端,fd[0]为读端,fd[1] 为写端。对于一个进程来说,要么对管道进行读操作,要么对其进行写操作,不可以自己写

weixin_45074185的博客 736

Linux 管道

在Linux中,管道(pipe)是一种进程间通信机制,它允许将一个命令的输出直接作为另一个命令的输入。管道使用符号来连接命令,实现数据的流向。创建管道的系统调用是 pipe,其包含在头文件参数 int pipefd[2]是一个输出型参数,是一个长度为2的数组,其中 pipefd[0]是管道的读端fd,而pipefd[1]是管道的写端fd。管道的工作原理是在内核中创建一个缓冲区,用于存储一个命令的输出和另一个命令的输入。

2301_79881188的博客 2517

Linux 高级编程 - 无名管道 Pipe

Linux 高级编程 - 无名管道 Pipe

cdeveloper 的专栏 1842

告别Sourceforge安装器!手把手教你下载MinGW-w64离线包并配置环境变量(Windows 10/11)

本文详细介绍了如何在Windows 10/11系统上通过下载MinGW-w64离线包并配置环境变量,完全绕过Sourceforge安装器的问题。从选择正确的版本、解压到本地目录,到设置系统环境变量和验证编译环境,手把手指导开发者快速搭建稳定的GCC编译环境,解决常见的安装困扰。

weixin_30896825的博客 336

linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF

一、当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。 O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。 示例程序如下:  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1

Meditation 9999

人形机器人五大核心零部件技术解析与国产化实况

人形机器人并非简单机械集成,而是物理、能量、感知、决策与执行五层系统毫秒级协同的复杂体。其性能瓶颈往往不在于整机算法,而深植于谐波减速器的刚度稳定性、无框力矩电机的功率密度与温升控制、六维力传感器的动态响应与温漂抑制、运动控制器的实时OS生态及灵巧手的多指协同精度等底层硬件能力。这些部件共同构成整机68.3%的成本,且国产化率差异显著——谐波减速器达72%,而高精度力矩传感器仍受制于日德厂商。本文聚焦‘谐波减速器’和‘六维力传感器’两大热词,从材料工艺、参数定义、失效模式到产线验证,揭示真正卡脖子的技术关卡

weixin_29065959的博客 406

Linux进程通信(一)——pipe管道

本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信进程通信就是两个进程之间进行数据交换,在Linux中有好几种可以进行进程通信的方式,在这篇文章中我们主要介绍最基本的进程通信方式——pipe管道。进程通信的途径进程之间交换信息的唯一途径就是传送打开的文件。管道(pipe)管道是一种最古老也是

leap的博客 1万+

彻底解决0x80070005错误代码:全面分析与实战指南

0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。

nntxthml的博客 6933

MTK手机传感器驱动开发避坑指南:从SCP代码大小限制到Overlay加载流程详解

本文详细解析了MTK平台传感器驱动开发中的常见问题,包括SCP代码大小限制、Overlay加载流程及客制化传感器集成。通过实战案例和优化策略,帮助开发者高效解决MTK传感器驱动开发中的技术难题,提升开发效率。

weixin_42522374的博客 400

Linux 管道pipe

一、何为管道? 管道是一种最基本的IPC机制,由pipe函数创建: #include 
 int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户 程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输出1是标

qq_32632659的博客 522

抖音直播行为规范考试

抖音直播行为规范考试

Q1642968641的博客 1万+

linux pipe大小,Linux下的管道pipe----管道容量和實現機制

管道容量linux上的PipE容量為(capacity)65536個字節;實驗得到Ubuntu的PIPE_BUF為4096。當 管道的寫端存在時,如果請求的字節數目大於PIPE_BUF,則返回管道中現有的數據字節數,如果請求的字節數目不大於PIPE_BUF,則返回管道中現有數據字節數(此時,管道中數據量小於請求的數據量);或者返回請求的字節數(此時,管道中數據量不小於請求的數據量)(PIPE_BU...

weixin_39941620的博客 1052

Ubuntu视频播放器怎么选?VLC、mpv、SMPlayer硬解与字幕配置指南

在Linux系统中,视频播放体验取决于播放器、解码器与显卡驱动的协同。硬件解码通过VA-API或VDPAU将解码任务交给GPU,能显著降低CPU占用,解决4K高码率视频卡顿问题。对于Ubuntu用户,合理配置解码环境与播放器,可流畅播放HEVC、多音轨及ASS特效字幕视频。无论是日常观影、番剧追更还是家庭影院场景,选择合适的播放器并正确启用硬解,都是提升体验的关键。本文围绕Ubuntu平台,详解VLC、mpv、SMPlayer等播放器的安装、硬解配置与常见问题排查,帮助你在Linux上获得流畅的本地视频播放

weixin_33801856的博客 506

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 259

Linux Pipe 管道性能

在交换机项目中有使用命名管道用于线程与主进程间的通信,由于瞬间的数据量特别大(主要是瞬间可能并发学习到大量的mac),现有管道的性能会出现丟事件的问题,因此,查阅了相关资料整理如下可以尝试提高管道的性能。 容量限制 在 Linux 中管道的能力是有限的,对于一个应用来说,如果管道满了,那么会导致 write() 系统调用被阻塞 (依赖于程序是否设置了 O_NONBLOCK 标志)。不同的系统对应的 Pipe 能力不同,所以应用应该做到尽快读取 Pipe 中的数据,以防止阻塞。 最大容量 在 man 7 pi

不能让自己太安逸,努力奋斗才是真 2165

OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”

第一章:OSG介绍; 1.1 OSG简介。

LuckyHanMo的博客 3222

Linux下的管道pipe----管道容量和实现机制

管道容量     linux上的PipE容量为(capacity)65536个字节;实验得到Ubuntu的PIPE_BUF为4096。    当 管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数

ZoctopusD的博客 2919

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pipe匿名管道实操(Linux)

全称为 "error number"。它由系统或标准库函数在操作失败时设置,用于指示具体的错误原因。能更清晰地表达“这是 C++ 代码”的意图,并可能在未来的标准中更好地支持命名空间隔离。更安全,因为它可以防止缓冲区溢出(Buffer Overflow)C++ 标准库对 C 标准库的头文件进行了重新封装,采用无。是 C 标准库中的一个格式化输出函数,用于。它是静态计算的,不会在运行时影响程序性能。),以区别于 C 的传统头文件(如。未输出的内容会被强制写入)。(按注册的逆序执行)。

weixin_73266891的博客 1377

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

linux内核管道pipe实现详解

linux内核管道pipe实现详解

arm7star的博客 4677

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux系统编程】无名管道pipe的使用

Linux无名管道pipe的使用 1.函数原型 int pipe(int pipefd[2]); 函数返回值:成功返回 0;失败返回-1;设置error pidfd[0]为读 ; pipefd[1]为写 管道中,数据读走了,就没有数据 pipe函数包含在unistd.h头文件中 如果pipe在读数据的时候,管道中没有数据,则会保持阻塞状态,直到有数据读出 2. pipe实例 使用pipe所要完成的功能为:子进程写数据到管道,父进程读数据并且将内容显示到终端实例程序: #include

weixin_42615166的博客 311

【Linux进程间通信】二、pipe管道

Linux进程间通信方式之管道pipe,更多Linux文章请关注专栏《Linux从小白到大神》。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 3604

linux系统编程之管道(一):匿名管道和pipe函数

一、进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。如下图所示。 二、管道是一种最基本的IPC机制,由pipe函

Meditation 1万+
上一篇: Linux下进程通信
下一篇: 管道pipe
EncodedStar
博客等级 码龄10年 2614粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值