请教关于“多个进程往同一个匿名管道写数据”时的进程间数据同步问题
【嵌入式Linux】<总览> 进程间通信 在文章【嵌入式Linux】<总览> 多进程中已经介绍了进程的相关概念和创建多个进程的方法。本篇聚焦于进程间通信的方式,若涉及版权问题请联系本人删除。 阅读详情
父进程A:
int main()
{
// 步骤1:创建一个匿名管道
// 步骤2:创建5子进程B,并重定向子进程的标准输出
// 步骤3:调用WaitForMultiObjects()等待5个子进程执行结束,通过GetTickCount()计算子进程执行花费的时间
// 步骤4:读取匿名管道中的内容到一个缓冲区中 char buffer[1024 * 4]
return 0;
}
子进程B:
int main()
{
DWORD dwCurProcessID = GetCurrentProcessId();
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
return 0;
}
// 疑问:
1. 等待5个子进程B执行完毕花费的时间不超过5s,而每个子进程B需要Sleep 3s,说明写匿名管道是异步的?
2. 父进程从匿名管道中读取到得数据是以下形式:
4896: 00001111
4896: 00001111
4896: 00001111
5012: 00001111
5012: 00001111
5012: 00001111
... ...
也就是说,数据是一个进程写完,才能够下一个进程往管道写数据,这是典型的同步模式?
那么,多个进程往一个匿名管道写数据,到底是同步还是异步?
我跟踪看了printf的实现代码,用的是旋转锁,该锁是用户对象,只能用于同一个进程内部的线程间同步,而上述场景是进程之间的线程同步,实验结果表明往管道写数据是经过同步的,那么说明匿名管道本身具有线程安全属性?
int main()
{
// 步骤1:创建一个匿名管道
// 步骤2:创建5子进程B,并重定向子进程的标准输出
// 步骤3:调用WaitForMultiObjects()等待5个子进程执行结束,通过GetTickCount()计算子进程执行花费的时间
// 步骤4:读取匿名管道中的内容到一个缓冲区中 char buffer[1024 * 4]
return 0;
}
子进程B:
int main()
{
DWORD dwCurProcessID = GetCurrentProcessId();
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
return 0;
}
// 疑问:
1. 等待5个子进程B执行完毕花费的时间不超过5s,而每个子进程B需要Sleep 3s,说明写匿名管道是异步的?
2. 父进程从匿名管道中读取到得数据是以下形式:
4896: 00001111
4896: 00001111
4896: 00001111
5012: 00001111
5012: 00001111
5012: 00001111
... ...
也就是说,数据是一个进程写完,才能够下一个进程往管道写数据,这是典型的同步模式?
那么,多个进程往一个匿名管道写数据,到底是同步还是异步?
我跟踪看了printf的实现代码,用的是旋转锁,该锁是用户对象,只能用于同一个进程内部的线程间同步,而上述场景是进程之间的线程同步,实验结果表明往管道写数据是经过同步的,那么说明匿名管道本身具有线程安全属性?
...全文
相关推荐
C++ MFC之进程间通信(匿名管道)
本实例利用匿名管道技术实现多进程之间的通信,实现了进程之间的发送数据和接收数据。
Linux通过匿名管道进行进程间通信
主要介绍了Linux通过匿名管道进行进程间通信,介绍了什么是管道,popen函数,pipe调用等相关内容,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
命名管道用于进程间双向通信
采用windows API 匿名管道实现进程间双向通信,代码有注释
进程间通过匿名管道通信实例
进程间通过匿名管道通信实例,平台VS2010。这只是一个简单实例,供大家学习参考用。本人也只是菜鸟一个。
使用MFC实现匿名管道通信实践指南
本文还有配套的精品资源,点击获取 简介:匿名管道是进程间通信的一种简单机制,特别适用于父子进程之间的数据交换。在Windows中,它通过内核对象实现单向通信。本文展示了如何利用Microsoft Foundation Classes(MFC)库中的 CArchive 类来操作匿名管道,包括创建管道、启动子进程、数据读写等步骤。案例中包含了创建和读取管道的代码示...


进程/线程/DLL
