管道

管道,其本质是一个伪文件(实为内核缓冲区);由两个文件描述符引用,一个表示读端、一个表示写端;规定数据从管道的写端流入,读端流出。

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

  必须用于有血缘关系的进程

  

  管道的局限性:

 

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

 

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

 

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

 

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

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

 

pipe,创建管道

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

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

示例:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 
 4 int main(void)
 5 {
 6     int fd[2];
 7     pid_t pid;
 8     
 9     int ret = pipe(fd);     //定义管道  父进程占用两端
10     if(ret == -1)
11     {
12         perror("pipe error");
13         exit(1);
14     }
15     pid = fork();
16     if(pid == -1)
17     {
18         perror("fork error");
19         exit(1);
20     }else if(pid == 0)//子进程(也占用了两端)    子进程读,将写端关闭    默认0读   1写
21     {
22         close(fd[1]);
23         char buf[1024];
24         ret read(fd[0], buf, sizeof(buf));    //将管道看作文件操作
25         if(ret == 0){
26             printf("----\n");    //读完
27         }
28         write(STDOUT_FILENO,buf, ret);    //写到屏幕
29     }else{    //父进程   关闭读端
30         close(fd[0]);
31         char *str = "hello pipe\n";
32         write(fd[1],"hello pipe\n", strlen("hello pipe\n"));
33     }
34     return 0;
35 }

 

转载于:https://www.cnblogs.com/lr1402585172/p/10512838.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/S、B/S的区别

C/S结构&#xff0c;即Client/Server(客户机/服务器)结构&#xff0c;是大家熟知的软件系统体系结构&#xff0c;通过将任务合理分配到Client端和Server端&#xff0c;降低了系统的通讯开销&#xff0c;可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。…

extern c用法解析

http://www.jianshu.com/p/5d2eeeb93590 引言C保留了一部分过程式语言的特点&#xff0c;因而它可以定义不属于任何类的全局变量和函数。但是&#xff0c;C毕竟是一种面向对象的程序设计语言&#xff0c;为了支持函数的重载&#xff0c;C对全局函数的处理方式与C有明显的不同。…

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表&#xff08;带头结点&#xff09;的基本操作&#xff08;创建&#xff0c;头插法&#xff0c;尾插法&#xff0c;删除结点&#xff0c;打印链表&#xff09; [plain] view plaincopy #include<…

静态网页与动态网页区别

一、静态web页面&#xff1a;1、在静态Web程序中&#xff0c;客户端使用Web浏览器&#xff08;IE、FireFox等&#xff09;经过网络(Network)连接到服务器上&#xff0c;使用HTTP协议发起一个请求&#xff08;Request&#xff09;&#xff0c;告诉服务器我现在需要得到哪个页面&…

单向循环链表C语言实现

http://blog.csdn.net/morixinguan/article/details/51771633 我们都知道&#xff0c;单向链表最后指向为NULL&#xff0c;也就是为空&#xff0c;那单向循环链表就是不指向为NULL了&#xff0c;指向头节点&#xff0c;所以下面这个程序运行结果就是&#xff0c;你将会看到遍历…

web服务器原理

什么是web服务器&#xff1f; 在Mosaic浏览器&#xff08;通常被认为是第一个图形化的web浏览器&#xff09;和超链接内容的初期&#xff0c;演变出了“web服务器”的新概念&#xff0c;它通过HTTP协议来提供静态页面内容和图片服务。在那个时候&#xff0c;大多数内容都是静态…

(C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

http://blog.csdn.net/fisherwan/article/details/19760681 上午写了下单向循环链表的程序&#xff0c;今天下午我把双向链表的程序写完了。其实双向链表和单向链表也是有很多相似的地方的&#xff0c;听名字可以猜到&#xff0c;每个节点都包含两个指针&#xff0c;一个指针指…

竞态条件

pause函数 调用该函数可以造成进程主动挂起&#xff0c;等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void); 返回值&#xff1a;-1 并设置errno为EINTR 返回值&#xff1a; ① 如果信号的默认处理动作是终止进程&#…

(C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

http://blog.csdn.net/fisherwan/article/details/25557545 前段时间用C语言实现了链表的相关操作&#xff0c;但是发现当时挺清楚的&#xff0c;过了一段时间又忘的差不多了&#xff0c;所以现在打算用C再实现一遍&#xff0c;由于初次用C实现&#xff0c;存在错误的地方还望大…

(C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作

http://blog.csdn.net/fisherwan/article/details/19754585 昨天写了单向链表的代码&#xff0c;今天上午把单向循环链表的程序给敲完了。链表的相关操作一样的&#xff0c;包含链表的创建、判断链表是否为空、计算链表长度、向链表中插入节点、从链表中删除节点、删除整个链表…

计科院首页静态网页

一.HTML代码 <!DOCTYPE html><html><head><meta charset"UTF-8"><title>首页</title> </head><body><div id"page"> <div id"page_head"> <div id"logo" aligncenter…

可重入函数

一个函数在被调用执行期间(尚未调用结束)&#xff0c;由于某种时序又被重复调用&#xff0c;称之为“重入”。根据函数实现的方法可分为“可重入函数”和“不可重入函数”两种。 注意事项 定义可重入函数&#xff0c;函数内不能含有全局变量及static变量&#xff0c;不能使用ma…

(C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的&#xff0c;和双向链表的操作差不多&#xff0c;唯一的区别就是它是个循环的链表&#xff0c;通过每个节点的两个指针把它们扣在一起组成一个环状。所以呢&#xff0c;每个…

SIGCHLD

SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态&#xff0c;接受到SIGCONT后唤醒时 借助SIGCHLD信号回收子进程 子进程结束运行&#xff0c;其父进程会收到SIGCHLD信号。该信号的默认处理动作是忽略。可以捕捉该信号&#xff0c;在捕捉函数中…

(C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)

http://blog.csdn.net/fisherwan/article/details/19701027 我学习了几天数据结构&#xff0c;今天下午自己写了一个单向链表的程序。我也是新手&#xff0c;所以刚开始学习数据结构的菜鸟们&#xff08;有大牛们能屈尊看一看&#xff0c;也是我的荣幸&#xff09;可以和我一起…

中断系统调用

中断系统调用 系统调用可分为两类&#xff1a;慢速系统调用和其他系统调用。 慢速系统调用&#xff1a;可能会使进程永远阻塞的一类。如果在阻塞期间收到一个信号&#xff0c;该系统调用就被中断,不再继续执行(早期)&#xff1b;也可以设定系统调用是否重启。如&#xff0c;rea…

(C++版)链表(二)——实现单项循环链表创建、插入、删除等操作

http://blog.csdn.net/fisherwan/article/details/25561857 链表&#xff08;二&#xff09;单向循环链表的实现&#xff0c;下面实现代码&#xff1a; [cpp] view plaincopy <span style"font-size:18px;" deep"5">#include <iostream> #in…

会话

创建会话 创建一个会话需要注意以下6点注意事项&#xff1a; 调用进程不能是进程组组长&#xff0c;该进程变成新会话首进程(session header)该进程成为一个新进程组的组长进程。需有root权限(ubuntu不需要)新会话丢弃原有的控制终端&#xff0c;该会话没有控制终端该调用进程是…

守护进程

守护进程 Daemon(精灵)进程&#xff0c;是Linux中的后台服务进程&#xff0c;通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。 Linux后台的一些系统服务进程&#xff0c;没有控制终端&#xff0c;不能直接和用户交互。不受用户登…

(C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作

http://blog.csdn.net/fisherwan/article/details/25649073 链表&#xff08;三&#xff09;实现双向链表操作&#xff0c;代码如下&#xff1a; [cpp] view plaincopy <span style"font-size:18px;" deep"5">#include <iostream> #include …