在 Windows 环境下,编写一段程序,创建两个子进程,并由父进程重复显示字符 串“parent:”和自己的标识数,子进程则重复显示字符串“child:”和自己的标识数,C语言,用结构体,不用fork
时间: 2024-10-12 09:14:21 浏览: 65
在Windows环境下,由于缺乏标准的`fork()`函数,我们可以使用Windows API中的CreateProcess()函数来模拟创建子进程。这里我们将使用`stdio.h`, `windows.h`, 和自定义的结构体来实现这个需求。首先,我们需要定义一个结构体来存储子进程的信息:
```c
#include <stdio.h>
#include <windows.h>
typedef struct {
HANDLE hChild; // 子进程句柄
int childID; // 子进程ID
} ProcInfo;
// 创建子进程的函数
void createChildProc(ProcInfo* pInfo) {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; // 隐藏窗口
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); // 使用标准输入
si.hStdOutput = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // 创建子进程的标准输出
if (CreateProcess(NULL, "cmd /c echo child: %d", NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi)) {
pInfo->hChild = pi.hProcess;
pInfo->childID = pi.dwProcessId;
printf("Parent process created child with PID: %d\n", pInfo->childID);
} else {
printf("Failed to create child process.\n");
}
}
// 父进程的部分
int main() {
ProcInfo parentInfo;
parentInfo.childID = GetCurrentProcessId();
// 创建第一个子进程
createChildProc(&parentInfo);
while (true) {
printf("Parent: %d\n", parentInfo.childID);
Sleep(1000); // 每秒显示一次
}
return 0;
}
```
在这个示例中,我们创建了一个简单的`createChildProc`函数,它启动一个新的命令提示符进程,并让其打印出"child: [子进程ID]"。然后在父进程中,通过不断地循环并显示自身的进程ID,同时等待子进程的消息。
注意:Windows API的CreateProcess并不支持直接传递字符串给子进程运行指定命令,所以我们在这里假设有一个子进程命令可以接受子进程ID作为参数。实际应用中,你可能需要使用更为复杂的方式,如写入子进程的共享内存或管道等。
阅读全文