linux管道学习(二)

 1 int main()
 2 {
 3     char* pipename = "pipe";
 4     mkfifo(pipename,0777);
 5     int pid = fork();
 6     if(pid < 0)
 7     {
 8         printf("Error In Fork\n");
 9         exit(-1);
10     }
11
12     if(pid == 0)
13     {
14         printf("In Child Process\n");
15         int fd = open(pipename,O_WRONLY|O_NONBLOCK);
16         node testnode;
17         testnode.a = 10;
18         testnode.b = 20;
19
20         write(fd,&testnode,sizeof(testnode));
21
22         testnode.a = 11;
23         testnode.b = 22;
24
25         write(fd,&testnode,sizeof(testnode));
26
27         close(fd);
28         printf("Child Process Is Over \n");
29     }
30     if(pid > 0)
31     {
32
33         printf("In Parent Process\n");
34
35         int fd = open(pipename,O_RDONLY);
36
37         node testnode;
38         read(fd,&testnode,sizeof(node));
39         printf("Msg From Child node a = %d,b = %ld \n",testnode.a,testnode.b);
40
41         read(fd,&testnode,sizeof(node));
42         printf("Msg From Child node a = %d,b = %ld \n",testnode.a,testnode.b);
43
44         close(fd);
45
46         waitpid(pid,NULL,0);
47         printf("Praent Process Is Over \n");
48     }
49
50
51 }

在阻塞情况下,管道会阻塞直到有内容写入

读取时如果管道为空会等待有内容可以读取

在打开管道的时候可以选择非阻塞方式O_NONBLOCK

如果是非阻塞方式则忽略当前管道状态

命名管道不仅可以在有亲缘关系的进程中进行通信,也可以在无亲缘关系的进程中通信。

时间: 2024-10-18 12:22:25

linux管道学习(二)的相关文章

linux管道学习(一)

最近学习了管道 pipe,在这里进行一下总结. 这里贴一段自己的实做代码 struct node{ int a; long b; }; int main() { int field[2]; pid_t pid; char buf[256]; int returned_count; pipe(field); //fcntl(field[0], F_SETFL, O_NONBLOCK); int status; pid = fork(); if(pid < 0) { printf("Error

Linux系统学习 二、测评-身份鉴别1

身份鉴别 1)对登陆操作系统和数据库系统的用户进行身份表示和鉴别 1.密码文件中的口令字段是否不为空 2.检查各个用户主目录下的.rhosts文件 3.查看/etc/hosts.equiv 学习: 1.用户主目录 ~代表用户主目录 对一般用户而言,~表示/home/(用户名) 对root用户而言,~表示/root root用户主目录 显示当前目录 pwd   显示当前目录 pwd –p  显示当前目录的绝对路径 4.查看/etc/passwd文件中各种用户的第二段处是否不为空 5.输入find

Linux系统学习 二十、SAMBA服务—介绍、安装、端口

1.简介 网络数据文件共享服务器 可以和Windows中的网上邻居通用 数据共享的方法: Windows中最常用的是“网上邻居”.网上邻居使用的文件系统是CIFS(通用互联网文件系统)协议进行数据共享,不能跨网段,跨路由. Linux中最常用的是NFS服务 由来: 在1991年Andrew Tridgell为了实现Unix和Windows之间文件共享,开发了SMB(Server Message Block,服务消息块)文件系统 Samba与NetBIOS协议 IBM开发的NetBIOS协议是为了

【Linux总结】Linux命令学习二

目录管理:     ls.cd.pwd.mkdir.rmdir.tree 文件管理:     touch.stat.file.rm.cp.mv.nano 日期管理:     date.clock.hwclock.cal 查看文本:     cat.tac.more.less.head.tail     cat:连接并显示 正序显示(dump直接显示所有信息 没有分屏显示)         -n:显示行号         -E:显示换行符          tac:和cat类似只是倒序显示    

Linux程序设计学习笔记----进程间通信——管道

转载请注明出处: http://blog.csdn.net/suool/article/details/38444149, 谢谢! 进程通信概述 在Linux系统中,进程是一个独立的资源管理单元,但是独立而不孤立,他们需要之间的通信,因此便需要一个进程间数据传递.异步.同步的机制,这个机制显然需要由OS来完成管理和维护.如下: 1.同一主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue)和共享内存(Share Memory).无名管道多用于亲

Linux线程学习(二)

一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可以读或写声明过的全局变量.如果曾用fork() 编写过重要代码,就会认识到这个工具的重要性.为什么呢?虽然fork() 允许创建多个进程,但它还会带来以下通信问题:如何让多个进程相互通信,这里每个进程都有各自独立的内存空间.对这个问题没有一个简单的答案.虽然有许多不同种类的本地IPC (进程间通信)

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

Linux IPC(Inter-Process Communication,进程间通信)之管道学习

1.标准流管道 管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose popen的详细介绍在本blog:Linux 多进程学习中有具体介绍 2.无名管道(PIPE) 特点: 1)仅仅能在亲缘关系进程间通信(父子或兄弟) 2)半双工(固定的读端和固定的写端) 3)是特殊文件,能够用read,write等,在内存中 管道函数原型: #include<unistd.h> int pipe(int fds[2]); 管道在程序中用一对文件描写叙述符表示,一个是可读属

Linux netfilter 学习笔记 之十二 ip层netfilter的NAT模块代码分析

本节主要是分析NAT模块相关的hook函数与target函数,主要是理清NAT模块实现的原理等. 1.NAT相关的hook函数分析 NAT模块主要是在NF_IP_PREROUTING.NF_IP_POSTROUTING.NF_IP_LOCAL_OUT.NF_IP_LOCAL_IN四个节点上进行NAT操作,在上一节中我们知道nat表中只有PREROUTING.POSTROUTING.LOCAL_OUT三条链,而没有NF_IP_LOCAL_IN链,所以不能创建在LOCAL_IN hook点的SNAT