鱼C论坛

 找回密码
 立即注册
查看: 490|回复: 3

[已解决]进程管理创建阻塞与唤醒挂起与释放

[复制链接]
发表于 2024-12-12 22:49:12 | 显示全部楼层 |阅读模式
60鱼币
1、使用数据结构模拟进程结构创建两个进程,计算(3+2)-(5+2),以及使用kill杀死进程,wait语句避免僵尸进程;
2、使用sleep语句实现进程休眠,并完成正确计算上步骤公式;
3、使用signal语句完成信号捕捉程序;
4、模拟实现阻塞与唤醒功能;
5、模拟实现挂起与释放功能;
使用C语言在windows系统下codeblocks里能完整运行的
最佳答案
2024-12-12 22:49:13
赵屿 发表于 2024-12-12 22:56
用数据结构与算法


要在C语言中使用数据结构和算法来模拟进程管理并完成你提到的功能,可以采用简单的数据结构来记录进程信息并通过基本算法实现进程的创建、阻塞、挂起等操作。以下是一个基本的示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <signal.h>

  5. typedef struct {
  6.     int id;
  7.     char *name;
  8.     int result;
  9.     int isRunning;
  10. } Process;

  11. Process *createProcess(int id, char *name) {
  12.     Process *p = (Process *)malloc(sizeof(Process));
  13.     p->id = id;
  14.     p->name = name;
  15.     p->result = 0;
  16.     p->isRunning = 1;
  17.     return p;
  18. }

  19. DWORD WINAPI runProcess(LPVOID lpParam) {
  20.     Process *p = (Process *)lpParam;
  21.     if (p->id == 1) {
  22.         Sleep(2000); // 模拟休眠
  23.         p->result = (3 + 2) - (5 + 2);
  24.         printf("%s: Calculated result = %d\n", p->name, p->result);
  25.     } else {
  26.         printf("%s: Waiting for Process 1\n", p->name);
  27.         while (p->isRunning) {
  28.             Sleep(100); // 轮询等待进程1结束
  29.         }
  30.         printf("%s: Process 1 finished\n", p->name);
  31.     }
  32.     return 0;
  33. }

  34. void signalHandler(int signum) {
  35.     printf("Signal %d received\n", signum);
  36. }

  37. int main() {
  38.     signal(SIGINT, signalHandler);

  39.     Process *process1 = createProcess(1, "Process 1");
  40.     Process *process2 = createProcess(2, "Process 2");

  41.     HANDLE hThread1 = CreateThread(NULL, 0, runProcess, (LPVOID)process1, 0, NULL);
  42.     HANDLE hThread2 = CreateThread(NULL, 0, runProcess, (LPVOID)process2, 0, NULL);

  43.     SuspendThread(hThread1);
  44.     printf("%s suspended\n", process1->name);
  45.     Sleep(1000);
  46.     ResumeThread(hThread1);
  47.     printf("%s resumed\n", process1->name);

  48.     WaitForSingleObject(hThread1, INFINITE);
  49.     process1->isRunning = 0; // 设置为结束

  50.     WaitForSingleObject(hThread2, INFINITE);

  51.     CloseHandle(hThread1);
  52.     CloseHandle(hThread2);

  53.     free(process1);
  54.     free(process2);

  55.     return 0;
  56. }
复制代码


### 说明:

1. **数据结构**:使用`Process`结构体来表示一个进程对象,包含进程ID、名称、执行结果和运行状态。

2. **进程创建**:通过`createProcess`函数动态创建`Process`结构体的实例。

3. **进程运行**:在`runProcess`函数中模拟进程的执行逻辑,包括休眠、计算以及等待另一个进程完成。

4. **信号处理**:使用`signal`函数简要捕捉SIGINT信号,以便演示如何处理信号。

5. **阻塞与唤醒**:使用线程API的`SuspendThread`和`ResumeThread`来实现线程的阻塞和唤醒。

6. **内存管理**:动态分配和释放`Process`对象的内存,防止内存泄漏。

请在Code::Blocks中创建一个C项目,并将上述代码粘贴到`main.c`中进行编译和运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

要在C语言中使用数据结构和算法来模拟进程管理并完成你提到的功能,可以采用简单的数据结构来记录进程信息并通过基本算法实现进程的创建、阻塞、挂起等操作。以下是一个基本的示例: ### 说明: 1. **数据结构**:使用`Process`结构体来表示一个进程对象,包含进程ID、名称、执行结果和运行状态。 2. **进程创建**:通过`createProcess`函数动态创建`Process`结构体的实例。 3. **进程运行**:在`runProcess` ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-12-12 22:49:13 | 显示全部楼层    本楼为最佳答案   
赵屿 发表于 2024-12-12 22:56
用数据结构与算法


要在C语言中使用数据结构和算法来模拟进程管理并完成你提到的功能,可以采用简单的数据结构来记录进程信息并通过基本算法实现进程的创建、阻塞、挂起等操作。以下是一个基本的示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <signal.h>

  5. typedef struct {
  6.     int id;
  7.     char *name;
  8.     int result;
  9.     int isRunning;
  10. } Process;

  11. Process *createProcess(int id, char *name) {
  12.     Process *p = (Process *)malloc(sizeof(Process));
  13.     p->id = id;
  14.     p->name = name;
  15.     p->result = 0;
  16.     p->isRunning = 1;
  17.     return p;
  18. }

  19. DWORD WINAPI runProcess(LPVOID lpParam) {
  20.     Process *p = (Process *)lpParam;
  21.     if (p->id == 1) {
  22.         Sleep(2000); // 模拟休眠
  23.         p->result = (3 + 2) - (5 + 2);
  24.         printf("%s: Calculated result = %d\n", p->name, p->result);
  25.     } else {
  26.         printf("%s: Waiting for Process 1\n", p->name);
  27.         while (p->isRunning) {
  28.             Sleep(100); // 轮询等待进程1结束
  29.         }
  30.         printf("%s: Process 1 finished\n", p->name);
  31.     }
  32.     return 0;
  33. }

  34. void signalHandler(int signum) {
  35.     printf("Signal %d received\n", signum);
  36. }

  37. int main() {
  38.     signal(SIGINT, signalHandler);

  39.     Process *process1 = createProcess(1, "Process 1");
  40.     Process *process2 = createProcess(2, "Process 2");

  41.     HANDLE hThread1 = CreateThread(NULL, 0, runProcess, (LPVOID)process1, 0, NULL);
  42.     HANDLE hThread2 = CreateThread(NULL, 0, runProcess, (LPVOID)process2, 0, NULL);

  43.     SuspendThread(hThread1);
  44.     printf("%s suspended\n", process1->name);
  45.     Sleep(1000);
  46.     ResumeThread(hThread1);
  47.     printf("%s resumed\n", process1->name);

  48.     WaitForSingleObject(hThread1, INFINITE);
  49.     process1->isRunning = 0; // 设置为结束

  50.     WaitForSingleObject(hThread2, INFINITE);

  51.     CloseHandle(hThread1);
  52.     CloseHandle(hThread2);

  53.     free(process1);
  54.     free(process2);

  55.     return 0;
  56. }
复制代码


### 说明:

1. **数据结构**:使用`Process`结构体来表示一个进程对象,包含进程ID、名称、执行结果和运行状态。

2. **进程创建**:通过`createProcess`函数动态创建`Process`结构体的实例。

3. **进程运行**:在`runProcess`函数中模拟进程的执行逻辑,包括休眠、计算以及等待另一个进程完成。

4. **信号处理**:使用`signal`函数简要捕捉SIGINT信号,以便演示如何处理信号。

5. **阻塞与唤醒**:使用线程API的`SuspendThread`和`ResumeThread`来实现线程的阻塞和唤醒。

6. **内存管理**:动态分配和释放`Process`对象的内存,防止内存泄漏。

请在Code::Blocks中创建一个C项目,并将上述代码粘贴到`main.c`中进行编译和运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-12-12 22:49:29 | 显示全部楼层
在Windows系统下使用C语言进行进程管理的模拟可以通过多线程来实现,因为Windows不支持Unix风格的进程管理。以下是一个简单的示例,展示如何使用线程来模拟进程的创建、阻塞、唤醒、挂起和释放。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <signal.h>

  5. HANDLE hThread1, hThread2;
  6. int result = 0;

  7. DWORD WINAPI Process1(LPVOID lpParam) {
  8.     printf("Process 1: Calculating (3+2)-(5+2)
  9. ");
  10.     Sleep(2000); // 模拟进程休眠
  11.     result = (3 + 2) - (5 + 2);
  12.     printf("Process 1: Result is %d
  13. ", result);
  14.     return 0;
  15. }

  16. DWORD WINAPI Process2(LPVOID lpParam) {
  17.     printf("Process 2: Waiting for Process 1 to complete
  18. ");
  19.     WaitForSingleObject(hThread1, INFINITE); // 避免僵尸进程
  20.     printf("Process 2: Process 1 completed
  21. ");
  22.     return 0;
  23. }

  24. void SignalHandler(int signal) {
  25.     printf("Signal received: %d
  26. ", signal);
  27. }

  28. int main() {
  29.     signal(SIGINT, SignalHandler); // 捕捉信号

  30.     hThread1 = CreateThread(NULL, 0, Process1, NULL, 0, NULL);
  31.     hThread2 = CreateThread(NULL, 0, Process2, NULL, 0, NULL);

  32.     // 模拟挂起和唤醒
  33.     SuspendThread(hThread1);
  34.     printf("Process 1 suspended
  35. ");
  36.     Sleep(1000);
  37.     ResumeThread(hThread1);
  38.     printf("Process 1 resumed
  39. ");

  40.     WaitForSingleObject(hThread2, INFINITE);

  41.     CloseHandle(hThread1);
  42.     CloseHandle(hThread2);

  43.     return 0;
  44. }
复制代码


### 说明:

1. **进程创建与计算**:使用`CreateThread`创建两个线程,分别模拟两个进程。第一个线程计算公式`(3+2)-(5+2)`。

2. **进程休眠**:使用`Sleep`函数模拟进程休眠。

3. **信号捕捉**:使用`signal`函数捕捉`SIGINT`信号。

4. **阻塞与唤醒**:使用`WaitForSingleObject`阻塞进程2,直到进程1完成。

5. **挂起与释放**:使用`SuspendThread`和`ResumeThread`模拟挂起和释放。

请确保在Code::Blocks中创建一个新的C项目,并将此代码粘贴到`main.c`文件中进行编译和运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-12-12 22:56:04 | 显示全部楼层
FishC 发表于 2024-12-12 22:49
在Windows系统下使用C语言进行进程管理的模拟可以通过多线程来实现,因为Windows不支持Unix风格的进程管理 ...

用数据结构与算法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 13:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表