linux中创建子进程 等待子进程退出 主进程退出
时间: 2024-10-29 09:24:47 浏览: 26
在Linux中,你可以使用`fork()`和`wait()`系统调用来创建子进程并等待其退出。以下是简单的步骤:
1. `fork()`: 这个函数用于复制当前进程,如果成功返回新进程ID(子进程),原进程返回0;若失败返回-1。例如:
```c
pid_t pid = fork();
if (pid == 0) { // 子进程
// 执行子进程的任务
} else if (pid > 0) { // 父进程
// 继续执行主进程任务
}
```
2. `exec()`: 在子进程中替换程序。通常在子进程分支使用它,防止子进程继续执行默认的`forked`代码。
3. `wait()`: 这个系列的函数(如`waitpid()`)用于父进程等待子进程完成。当子进程结束时,父进程会获取到子进程的状态。例如:
```c
int status;
waitpid(pid, &status, WUNTRACED); // 等待pid号的子进程
```
`WUNTRACED`选项表示等待无论是正常退出还是异常退出的子进程。
4. `exit()`: 当子进程完成了所有工作,可以调用`exit()`函数结束进程,并将状态信息传递给父进程(通过`status`变量)。
相关问题
linux,利用cgroup进行挂载,将当前进程挂载到另外一个进程上,作为子进程存在,当主进程退出后,子进程也退出
在 Linux 上,可以使用 cgroups 进行进程管理,通过将一个进程挂载到另一个进程的 cgroup 中,可以使得子进程在主进程退出时也随之退出。具体实现步骤如下:
1. 安装 cgroup 工具
您可以使用以下命令安装 cgroup 工具:
```
sudo apt-get install cgroup-tools
```
2. 创建 cgroup
使用以下命令创建一个名为 mygroup 的 cgroup:
```
sudo cgcreate -g cpu,memory:/mygroup
```
3. 将子进程挂载到 cgroup 中
使用以下命令将当前进程挂载到 mygroup cgroup 中:
```
sudo cgclassify -g cpu,memory:/mygroup [pid]
```
其中,[pid] 是子进程的进程 ID。这将把子进程的 CPU 和内存资源限制为 mygroup cgroup 中的限制。
4. 启动子进程
使用以下命令启动子进程:
```
sudo cgexec -g cpu,memory:/mygroup [command]
```
其中,[command] 是要启动的子进程的命令。
5. 退出主进程
当主进程退出时,子进程也会随之退出,因为它已经被挂载到主进程的 cgroup 中。
注意:如果您的系统没有启用 cgroup,请在启动时使用 "cgroup_enable=memory swapaccount=1" 内核参数。
linux c语言创建进程池
要在Linux下使用C语言创建进程池,可以按照以下步骤:
1. 创建进程池结构体,用于存储进程池相关信息,如进程池大小、当前已有进程数、互斥锁等。
2. 在主进程中创建进程池,即创建一定数量的子进程,将它们放入进程池中。
3. 当有任务需要处理时,主进程从进程池中取出一个空闲进程,将任务分配给它处理。
4. 子进程在处理完任务后,将自己标记为空闲状态,然后等待下一次任务分配。
以下是一个简单的进程池实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#define MAX_PROCESS_NUM 10
#define MAX_TASK_NUM 100
typedef struct {
pid_t pid;
int is_busy;
} Process;
typedef struct {
pthread_mutex_t lock;
Process *process_list;
int process_num;
int task_num;
} ProcessPool;
int create_process_pool(int num, ProcessPool *pool);
int destroy_process_pool(ProcessPool *pool);
int process_task(ProcessPool *pool);
int main() {
ProcessPool pool;
if (create_process_pool(MAX_PROCESS_NUM, &pool) == -1) {
printf("Failed to create process pool.\n");
exit(1);
}
// 处理任务
for (int i = 0; i < MAX_TASK_NUM; i++) {
process_task(&pool);
}
if (destroy_process_pool(&pool) == -1) {
printf("Failed to destroy process pool.\n");
exit(1);
}
return 0;
}
int create_process_pool(int num, ProcessPool *pool) {
pool->process_num = num;
pool->process_list = malloc(num * sizeof(Process));
if (pool->process_list == NULL) {
return -1;
}
// 初始化互斥锁
pthread_mutex_init(&pool->lock, NULL);
// 创建子进程
for (int i = 0; i < num; i++) {
pid_t pid = fork();
if (pid == -1) {
return -1;
} else if (pid == 0) {
// 子进程
while (1) {
// 等待任务
pthread_mutex_lock(&pool->lock);
for (int j = 0; j < pool->process_num; j++) {
if (pool->process_list[j].pid == getpid()) {
pool->process_list[j].is_busy = 0;
break;
}
}
pool->task_num--;
pthread_mutex_unlock(&pool->lock);
// 处理任务
printf("Process %d is processing task %d.\n", getpid(), MAX_TASK_NUM - pool->task_num);
sleep(1);
// 标记为空闲状态
pthread_mutex_lock(&pool->lock);
for (int j = 0; j < pool->process_num; j++) {
if (pool->process_list[j].pid == getpid()) {
pool->process_list[j].is_busy = 0;
break;
}
}
pthread_mutex_unlock(&pool->lock);
}
} else {
// 父进程
pool->process_list[i].pid = pid;
pool->process_list[i].is_busy = 0;
}
}
// 初始化任务数
pool->task_num = MAX_TASK_NUM;
return 0;
}
int destroy_process_pool(ProcessPool *pool) {
// 等待子进程退出
for (int i = 0; i < pool->process_num; i++) {
waitpid(pool->process_list[i].pid, NULL, 0);
}
// 释放资源
free(pool->process_list);
pthread_mutex_destroy(&pool->lock);
return 0;
}
int process_task(ProcessPool *pool) {
// 找出空闲进程
int index = -1;
pthread_mutex_lock(&pool->lock);
for (int i = 0; i < pool->process_num; i++) {
if (!pool->process_list[i].is_busy) {
pool->process_list[i].is_busy = 1;
index = i;
break;
}
}
pthread_mutex_unlock(&pool->lock);
if (index == -1) {
// 进程池已满,等待空闲进程
sleep(1);
process_task(pool);
} else {
// 分配任务
printf("Task %d is assigned to process %d.\n", MAX_TASK_NUM - pool->task_num, pool->process_list[index].pid);
pool->task_num--;
}
return 0;
}
```
阅读全文