用windows系统,用c语言编写一段程序,使用系统调用fork()来创建两个子进程,并由父进程重复显示字符 串“parent:”和自己的标识数,子进程则重复显示字符串“child:”和自己的标识数。
时间: 2024-10-08 17:13:04 浏览: 193
在Windows系统上,使用C语言编写程序时,由于`fork()`函数在Windows API中并不直接可用,我们需要使用CreateProcess函数来模拟多进程行为。下面是一个简单的示例,展示了如何在Windows环境下使用C++(因为C++有对Windows API的支持)创建子进程,并让它们分别显示相应的信息:
```cpp
#include <windows.h>
#include <iostream>
// 子进程信息处理函数
void child_process(int pid) {
char msg[] = "child: " + std::to_string(pid);
OutputDebugStringA(msg); // 输出到调试窗口
}
int main() {
// 创建一个管道用于通信
HANDLE pipe[2];
if (!CreatePipe(&pipe[0], &pipe[1], NULL, 0)) {
printf("Failed to create pipe.\n");
return 1;
}
// 父进程的句柄
HANDLE parent_read, parent_write;
// 启动子进程
STARTUPINFO si = { sizeof(si), };
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = pipe[1]; // 父进程读取子进程的输出
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
if (!CreateProcess(NULL, // 使用默认命令行
L"cmd.exe", // 执行shell,然后我们可以在shell中执行我们的任务
NULL, // 没有父进程ID
NULL, // 没有安全属性
FALSE, // 不继承父进程的句柄
0, // 初始堆栈大小
NULL, // 不使用环境变量
NULL, // 起始目录
&si, // 标准输入、输出和错误句柄
&pi)) // 进程信息
{
printf("Failed to start child process.\n");
CloseHandle(pipe[0]);
CloseHandle(pipe[1]);
return 1;
}
// 关闭写端
CloseHandle(pi.hThread);
parent_write = CloseHandle(pi.hProcess);
// 父进程读取子进程的输出
DWORD bytesRead;
char buffer[1024];
while (true)
{
ReadFile(pipe[0], buffer, sizeof(buffer), &bytesRead, NULL);
if (bytesRead == 0)
break; // 子进程结束
std::string output(buffer);
size_t pos = output.find(": ");
if (pos != std::string::npos)
{
int id = std::stoi(output.substr(pos + 2)); // 获取标识数
if (id == GetCurrentProcessId())
printf("parent: %d\n", id); // 如果是当前进程,显示消息
else
printf("%s", output.c_str()); // 否则,显示子进程的消息
}
}
// 关闭父进程的读端
CloseHandle(pipe[0]);
return 0;
}
阅读全文