赵屿 发表于 2024-12-12 22:49:12

进程管理创建阻塞与唤醒挂起与释放

1、使用数据结构模拟进程结构创建两个进程,计算(3+2)-(5+2),以及使用kill杀死进程,wait语句避免僵尸进程;
2、使用sleep语句实现进程休眠,并完成正确计算上步骤公式;
3、使用signal语句完成信号捕捉程序;
4、模拟实现阻塞与唤醒功能;
5、模拟实现挂起与释放功能;
使用C语言在windows系统下codeblocks里能完整运行的

FishC 发表于 2024-12-12 22:49:29

在Windows系统下使用C语言进行进程管理的模拟可以通过多线程来实现,因为Windows不支持Unix风格的进程管理。以下是一个简单的示例,展示如何使用线程来模拟进程的创建、阻塞、唤醒、挂起和释放。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <signal.h>

HANDLE hThread1, hThread2;
int result = 0;

DWORD WINAPI Process1(LPVOID lpParam) {
    printf("Process 1: Calculating (3+2)-(5+2)
");
    Sleep(2000); // 模拟进程休眠
    result = (3 + 2) - (5 + 2);
    printf("Process 1: Result is %d
", result);
    return 0;
}

DWORD WINAPI Process2(LPVOID lpParam) {
    printf("Process 2: Waiting for Process 1 to complete
");
    WaitForSingleObject(hThread1, INFINITE); // 避免僵尸进程
    printf("Process 2: Process 1 completed
");
    return 0;
}

void SignalHandler(int signal) {
    printf("Signal received: %d
", signal);
}

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

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

    // 模拟挂起和唤醒
    SuspendThread(hThread1);
    printf("Process 1 suspended
");
    Sleep(1000);
    ResumeThread(hThread1);
    printf("Process 1 resumed
");

    WaitForSingleObject(hThread2, INFINITE);

    CloseHandle(hThread1);
    CloseHandle(hThread2);

    return 0;
}

### 说明:

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 小助理,如未能正确解答您的问题,请继续追问。

赵屿 发表于 2024-12-12 22:56:04

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

用数据结构与算法

FishC 发表于 2024-12-12 22:56:26

赵屿 发表于 2024-12-12 22:56
用数据结构与算法

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

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <signal.h>

typedef struct {
    int id;
    char *name;
    int result;
    int isRunning;
} Process;

Process *createProcess(int id, char *name) {
    Process *p = (Process *)malloc(sizeof(Process));
    p->id = id;
    p->name = name;
    p->result = 0;
    p->isRunning = 1;
    return p;
}

DWORD WINAPI runProcess(LPVOID lpParam) {
    Process *p = (Process *)lpParam;
    if (p->id == 1) {
      Sleep(2000); // 模拟休眠
      p->result = (3 + 2) - (5 + 2);
      printf("%s: Calculated result = %d\n", p->name, p->result);
    } else {
      printf("%s: Waiting for Process 1\n", p->name);
      while (p->isRunning) {
            Sleep(100); // 轮询等待进程1结束
      }
      printf("%s: Process 1 finished\n", p->name);
    }
    return 0;
}

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

int main() {
    signal(SIGINT, signalHandler);

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

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

    SuspendThread(hThread1);
    printf("%s suspended\n", process1->name);
    Sleep(1000);
    ResumeThread(hThread1);
    printf("%s resumed\n", process1->name);

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

    WaitForSingleObject(hThread2, INFINITE);

    CloseHandle(hThread1);
    CloseHandle(hThread2);

    free(process1);
    free(process2);

    return 0;
}

### 说明:

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

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 进程管理创建阻塞与唤醒挂起与释放