c语言亲缘线程通过管道通信一些疑问
亲缘线程在使用管道时,发现第一次使用管道进行进行通信完全正常(./a.out 1),但当重新运行并使用新管道文件时候出现数据无法读取的问题(./a.out 2)(./a.out 3),甚至出现子线程部分语句并未执行问题,下面程序中会出现子进程perror(write)及以后语句未执行得到问题
1 #include<sys/types.h>
2 #include<sys/stat.h>
3 #include<unistd.h>
4 #include<fcntl.h>
5 #include<stdio.h>
6 #include<string.h>
7 int main(int argc ,char *argv[]){
8 umask(0);
9 mkfifo(argv[1],0777);
10 int len=0;
11 int *p=&len;
12 pid_t pid=fork();
13 perror("fork");
14 if(pid==0){
15 int fd=open(argv[1],O_WRONLY);
16 //perror("open");
17 char buff[]={'0'};
18 printf("这是子进程!\n");
19 printf("请输入要通信的字符:");
20 scanf("%s",buff);
21 *p=strlen(buff);
22 write(fd,buff,strlen(buff));
23 perror("write");
24 printf("子进程len:%d\n",*p);
25 close(fd);
26 }
27
28 else{
29 int fd=open(argv[1],O_RDONLY);
30
31 //perror("open");
32 sleep(5);
33 printf("父进程len:%d\n",*p);
34 char buff[20]={0};
35 printf("这是父进程!\n");
36 read(fd,buff,20);
37 perror("read");
38 printf("父进程读出:%s\n",buff);
39 close(fd);
40 }
41 return 0;
42 }
[root@localhost pid]# ./a.out 1
fork: Success
fork: Success
这是子进程!
请输入要通信的字符:23osd
write: Success
子进程len:5
父进程len:0
这是父进程!
read: Success
父进程读出:23osd
[root@localhost pid]# ./a.out 2
fork: Success
fork: Success
这是子进程!
请输入要通信的字符:sdgksls
父进程len:0
这是父进程!
read: Success
父进程读出:
[root@localhost pid]# ./a.out 3
fork: Success
fork: Success
这是子进程!
请输入要通信的字符:dflhlf'fd
父进程len:0
这是父进程!
read: Success
父进程读出:
[root@localhost pid]# ./a.out 1
fork: File exists
fork: File exists
这是子进程!
请输入要通信的字符:wqla
write: File exists
子进程len:4
父进程len:0
这是父进程!
read: File exists
父进程读出:w
[root@localhost pid]# ./a.out 1
fork: File exists
fork: File exists
这是子进程!
请输入要通信的字符:hdshds
write: File exists
子进程len:6
父进程len:0
这是父进程!
read: File exists
父进程读出:hdshds
[root@localhost pid]# ./a.out 1
fork: File exists
fork: File exists
这是子进程!
请输入要通信的字符:wejhee
write: File exists
子进程len:6
父进程len:0
这是父进程!
read: File exists
父进程读出:wejhee
[root@localhost pid]# ./a.out 1
fork: File exists
fork: File exists
这是子进程!
请输入要通信的字符:ahjk2';
父进程len:0
这是父进程!
read: File exists
父进程读出:
[root@localhost pid]# ./a.out 1
fork: File exists
fork: File exists
这是子进程!
请输入要通信的字符:ajgaka
write: File exists
子进程len:6
父进程len:0
这是父进程!
read: File exists
父进程读出:ajgaka
[root@localhost pid]#
c语言亲缘线程通过管道通信一些疑问的更多相关文章
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader
1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...
- Java多线程编程-线程之间的通信
转载自:这里 学习了基础的线程知识 看到了 线程之间的通信 线程之间有哪些通信方式呢? 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public ...
- C++和C#进程之间通过命名管道通信(上)
C++和C#进程之间通过命名管道通信(上) "命名管道"是一种简单的进程间通信(IPC)机制.命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支 ...
- PHP多进程编程(2):管道通信
一个进程如果是个人英雄主义,那么多进程就是集体主义.(不严格区分多进程 和 多线程的差别) 你不再是一个独行侠,而是一个指挥家. 独来独往,非常自由自在,但是,很多时候,不如众人拾柴火焰高. 这就是我 ...
- Linux IPC之管道通信
2017-04-07 管道通信在linux中使用较为频繁的进程通信机制.基于unix一切皆文件的传统,管道也是一种文件.所以可以使用一般的VFS接口对管道进行读写操作,如read.write.具体管道 ...
- java多线程三之线程协作与通信实例
多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...
- Java并发读书笔记:如何实现线程间正确通信
目录 一.synchronized 与 volatile 二.等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 三.等待通知典型 生产者消费者模型 ...
- windows10使用VS(VC++)创建c++多进程命名管道通信
代码可以在 这里 下载 代码主要涉及到: 管道通信 多线程(含临界区) 多进程通信 创建的子进程独立运行 更新日志: 04-12-2020 1. 去除自定义函数返回值,改为int作为函数返回值并增加相 ...
随机推荐
- C# 图片人脸识别
此程序基于 虹软人脸识别进行的开发 前提条件从虹软官网下载获取ArcFace引擎应用开发包,及其对应的激活码(App_id, SDK_key)将获取到的开发包导入到您的应用中 App_id与SDK_k ...
- Appium的工作原理
把我们写的python语言代码,看做客户端 通过客户端向appium服务器发送请求 appium服务器把我们的代码转换成手机可以识别的指令 然后把指令发给手机,手机根据指令做出相应的操作 最后手机把操 ...
- Java定时器的三种实现方式
一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ...
- 理解css相邻兄弟选择器
今天在菜鸟教程看到了css组合选择符的“相邻兄弟选择器”,刚开始对这个概念有些不太理解,通过查阅资料并且经过一些试验总算有了些头绪. 原文解释是“相邻兄弟选择器(Adjacent sibling se ...
- ThinkPHP 日志(如何学好一门技术,教学视频和文档的优缺)
ThinkPHP 日志(如何学好一门技术,教学视频和文档的优缺) 一.总结 一句话总结:教学视频中介绍的只是基础的最常用的使用,那些不常用的那些视频里面都不会介绍,因为需求小,所以还是需要好好去把参考 ...
- thinkphp5的Auth权限认证实战
thinkphp5的Auth权限认证实战 一.总结 一句话总结:基于角色的权限管理(真正做一遍,就会发现很简单,不然一直都是半懂不懂的) 角色 权限 真正做一遍,就会发现很简单,不然一直都是半懂不懂的 ...
- (转)C# 之泛型详解
什么是泛型 我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为 ...
- python+opencv 运行环境搭建
1:安装pycharm,验证码你懂的 2:安装python3.5以上,或3.6,python2和3 的版本差异还蛮大 3:安装opencv,如下图 以上是方法一,还有之中方法是下载whl文件再手动安装 ...
- spark app
使用Spark和Scala分析Apache访问日志 http://www.jdon.com/bigdata/analyzing-apache-access-logs-files-spark-scala ...
- Confluence 6 修改导航显示选项
选择 子页面(Child pages)来在边栏中查看当前页面的子页面. 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面. 你也可以选择是否完全隐藏导航显示选项或者添加你希望可 ...