编写一段程序,使其用管道来实现父子进程之间的进程通信。子进程向父进程发 送自己的进程标识符,以及字符串“is sending a message to parent!”。父进程则通过管道读 出子进程发来的消息,将消息显示在屏幕上,然后终止。在Windows 系统下用c语言
时间: 2024-11-05 16:27:33 浏览: 47
计算机操作系统实验-进程通信(一).doc
5星 · 资源好评率100%
在Windows系统下,使用C语言实现管道通信(管道通信通常在Unix/Linux环境下更为常见,在Windows上一般用Named Pipe,即命名管道)可能会稍微复杂一些,因为标准的`pipe()`函数在Windows API中并没有直接对应的。但是,我们可以使用`CreatePipe()`和`CreateProcess()`函数来模拟这个过程。
首先,创建一个命名管道:
```c
#include <windows.h>
LPSECURITY_ATTRIBUTES lpPipeAttributes = NULL;
HANDLE hReadPipe, hWritePipe;
if (CreatePipe(&hReadPipe, &hWritePipe, lpPipeAttributes, 0) == FALSE)
{
// 错误处理...
}
// 关闭不必要的管道句柄
if (hWritePipe != INVALID_HANDLE_VALUE)
{
CloseHandle(hWritePipe);
}
```
接着,创建子进程并写入信息:
```c
STARTUPINFO si = {0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
if (!CreateProcess(NULL, // 使用默认的启动目录
"cmd /c echo %d is sending a message to parent! && type nul > %s",
NULL, // 使用当前的安全上下文
NULL, // 不使用继承的权限
TRUE, // 标志新进程继承父进程的当前句柄集合
0, // 默认的创建标志
NULL, // 不传递环境变量
hWritePipe, // 写入管道句柄给子进程
&si, // 启动信息
&pi)) // 进程信息
{
// 错误处理...
}
WaitForSingleObject(pi.hProcess, INFINITE); // 等待子进程结束
CloseHandle(pi.hProcess); // 关闭子进程句柄
// 父进程关闭读取管道句柄
CloseHandle(hReadPipe);
```
最后,父进程从管道读取内容:
```c
char buffer[1024];
DWORD bytesRead;
if ( PeekNamedPipe(hReadPipe, buffer, sizeof(buffer), &bytesRead, NULL, NULL) )
{
DWORD bytesAvail;
if ( ReadFile(hReadPipe, buffer, bytesRead, &bytesRead, NULL) )
{
buffer[bytesRead] = '\0'; // 如果没读完,填充空字符
printf("Received from child process: %s\n", buffer);
}
else
{
// 错误处理...
}
}
else
{
// 错误处理...
}
CloseHandle(hReadPipe); // 最终关闭读取管道句柄
```
注意:以上代码示例仅适用于演示目的,实际使用时需要考虑错误处理和资源管理。此外,Windows命名管道的功能比Unix/Linux下的管道更丰富,这里只是简单展示了基本的交互。
阅读全文