c语言写进程阻塞完整代码并有注释
时间: 2024-12-28 10:39:24 浏览: 5
在C语言中,我们可以使用POSIX标准库中的`wait()`函数来让一个进程进入阻塞状态,等待其他子进程完成执行。下面是一个简单的示例,展示了如何创建一个父进程创建两个子进程,并让父进程阻塞等待其中一个子进程结束:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // 包含 wait 函数
#define MAX_CHILDREN 2 // 设置最多子进程数
void child_function(int id) {
printf("Child %d started\n", id);
sleep(id * 5); // 让子进程延迟一段时间
printf("Child %d finished\n", id);
}
int main() {
pid_t children[MAX_CHILDREN]; // 存储子进程ID
int i;
// 创建子进程
for (i = 0; i < MAX_CHILDREN; i++) {
if ((children[i] = fork()) == -1) { // fork失败返回-1
perror("Fork failed");
exit(EXIT_FAILURE);
} else if (children[i] == 0) { // 如果当前进程是子进程
child_function(i);
_exit(0); // 子进程结束
}
}
// 父进程等待子进程结束
printf("Parent process waiting for a child to finish...\n");
int status;
while (WIFEXITED(status)) {
// 使用waitpid获取任意一个已退出的子进程的状态
pid_t pid = wait(&status);
if (pid == -1) {
perror("Wait failed");
exit(EXIT_FAILURE);
} else {
printf("Child %d with PID %d exited with status %d\n",
WEXITSTATUS(status), pid, WEXITSTATUS(status));
}
}
return 0;
}
```
在这个例子中,`fork()`函数用于复制当前进程,如果成功,子进程会立即开始执行`child_function()`。父进程在循环中使用`waitpid()`等待任何一个子进程结束,并打印出相应的信息。
阅读全文