进程 退出

  • exit(0)
  • _exit(0)

进程退出

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    pid_t result;
    result = fork();
    if (result == -1) 
    {   
        printf("fork error\r\n");
    }   
    if (result == 0)
    {   
        //这里不能加换行符,在IO编成是有IO缓存区的\
        //printf遇到回车换行符就会从IO缓存区提取数据去打印
        //这里让数据一直保存在IO缓存区
        printf("Child");
        _exit(0);//推出进程,状态为0为正常退出
    }   
    else
    {   
        printf("parent");
        //会帮助我们找当前的进程有无IO缓存区
        //如果有数据会先把IO缓存区的数据处理了,_exit就不会管那么多
        exit(0);
    }
}

只打印处parent
在这里插入图片描述

### 子进程退出机制与相关函数 在 Linux 系统中,子进程退出时,其资源不会立即被释放,而是进入“僵尸进程”状态,等待父进程通过特定的系统调用来回收其资源。若父进程未进行回收,子进程将一直保持僵尸状态,导致资源浪费。因此,理解子进程退出机制及对应的函数是进程编程的重要内容。 #### 子进程退出方式 子进程可以通过以下方式退出: 1. **正常退出**:通过调用 `exit()` 或 `_exit()` 函数,子进程可以正常终止,并返回一个退出状态码给父进程。 2. **异常退出**:通过接收到某些信号(如 `SIGKILL` 或 `SIGSEGV`)而异常终止。 其中,`exit()` 会刷新标准 I/O 缓冲区,而 `_exit()` 则不会,这可能导致缓冲区内容丢失 [^3]。 #### 相关函数 ##### 1. `wait()` 函数 父进程可以使用 `wait()` 函数来等待任意一个子进程结束,并回收其资源。该函数会阻塞父进程,直到某个子进程退出。 ```c #include <sys/wait.h> #include <unistd.h> #include <stdio.h> int main() { pid_t pid = fork(); if (pid > 0) { int status; pid_t child = wait(&status); if (WIFEXITED(status)) { printf("Child exited with code %d\n", WEXITSTATUS(status)); } } else if (pid == 0) { sleep(2); exit(50); } return 0; } ``` ##### 2. `waitpid()` 函数 与 `wait()` 不同,`waitpid()` 可以指定等待某个特定的子进程,并支持非阻塞方式(通过 `WNOHANG` 选项)。这种方式更灵活,适用于多子进程管理场景 [^1]。 ```c pid_t pid = waitpid(child_pid, &status, WNOHANG); if (pid == 0) { // 子进程尚未退出 } else if (pid > 0) { // 子进程退出 } ``` ##### 3. `vfork()` 函数 `vfork()` 也可以用于创建子进程,但其行为与 `fork()` 不同。它会阻塞父进程,直到子进程调用 `exec()` 或 `exit()`。因此,子进程在 `vfork()` 后应尽快调用这些函数,以避免资源占用 [^1]。 ##### 4. `WIFEXITED` 和 `WEXITSTATUS` 这些宏用于检查子进程是否正常退出,并获取其退出状态码。例如: ```c if (WIFEXITED(status)) { printf("Child exited with code %d\n", WEXITSTATUS(status)); } ``` ##### 5. `WIFSIGNALED` 和 `WTERMSIG` 这些宏用于判断子进程是否因信号而异常终止,并获取终止信号的编号 [^2]。 ```c if (WIFSIGNALED(status)) { printf("Child was killed by signal %d\n", WTERMSIG(status)); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值