进程(2) wait、exec函数族

2024-08-21 01:04
文章标签 函数 进程 exec wait

本文主要是介绍进程(2) wait、exec函数族,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. fork() 函数

功能

使用时注意事项

2. exit() 函数

功能

使用时注意事项

3. wait() 函数

功能

使用时注意事项

总结

wait()

异常信号结束

waitpid

exec函数族

execl()

execlp()

execv

execvp


fork()exit() 和 wait() 函数在进程管理中扮演着重要的角色,它们之间的关系密切,了解它们的行为和使用方法对于编写可靠的多进程程序非常重要。下面是它们的基本功能、关系以及使用时需要注意的事项:

1. fork() 函数

功能
  • fork() 用于创建一个新的子进程。调用 fork() 后,父进程和子进程都会继续执行 fork() 之后的代码。
  • 在子进程中,fork() 返回 0,而在父进程中,fork() 返回子进程的 PID。
使用时注意事项
  • 错误处理fork() 如果失败,会返回 -1。要检查并处理这个错误。
  • 资源管理:子进程会复制父进程的内存空间,虽然这是高效的(写时拷贝),但要注意资源的合理分配和释放。
  • 进程隔离:子进程和父进程是相互独立的,它们可以有不同的执行路径和数据。

2. exit() 函数

功能
  • exit() 用于终止当前进程的执行,并返回一个状态码。状态码通过 exit() 函数的参数传递给操作系统。
  • 子进程调用 exit() 后会立即终止,其资源会被操作系统回收,且其退出状态会传递给父进程。
使用时注意事项
  • 退出状态:状态码可以通过 WEXITSTATUS(status) 从 wait() 或 waitpid() 获取,用于检查子进程的退出情况。
  • 清理资源:在调用 exit() 之前,确保所有打开的文件描述符和动态分配的内存得到妥善处理,以避免资源泄漏。

3. wait() 函数

功能
  • wait() 用于使父进程等待一个或多个子进程结束。它会阻塞,直到一个子进程终止,并获取子进程的终止状态。
  • waitpid() 是 wait() 的一个变体,允许更精细的控制,指定等待特定的子进程或使用非阻塞模式。
使用时注意事项
  • 避免僵尸进程:如果父进程不调用 wait() 或 waitpid(),子进程终止后会成为僵尸进程,直到父进程处理它们。调用 wait() 可以避免僵尸进程。
  • 多子进程管理:在处理多个子进程时,建议使用 waitpid() 以控制等待特定子进程的退出。
  • 处理子进程状态wait() 和 waitpid() 返回的状态信息可以通过 WIFEXITED(status) 和 WEXITSTATUS(status) 进行检查,以判断子进程是否正常退出及其退出状态。

总结

  • 创建子进程:使用 fork() 创建子进程。子进程会从 fork() 返回处开始执行,父进程也会继续执行。
  • 终止进程:子进程使用 exit() 终止自己,并返回状态码给操作系统。父进程可以通过 wait() 或 waitpid() 等待子进程结束,并获取其退出状态。
  • 资源回收:正确使用 wait() 或 waitpid() 避免僵尸进程,确保系统资源得到有效管理。

通过正确使用这些函数,可以实现有效的进程管理,确保多进程程序的稳定性和可靠性。

2.进程的退出
    
    

僵尸进程和孤儿进程
    
    僵尸进程:进程执行结束但空间未被回收变成僵尸进程

    1.exit     库函数
    退出状态,终止的进程会通知父进程,自己使如何终止的。如果是正常结束(终止),则由exit传入的参数。如果是异常终止,则有内核通知异常终止原因的状态。任何情况下,负进程都能使用wait,waitpid获得这个状态,以及资源的回收。
    void exit(int status) 
    exit(1);
    功能:
        让进程退出,并刷新缓存区
    参数:
        status:进程退出的状态
    返回值:
        缺省
    
    EXIT_SUCCESS    0
    EXIT_FAILURE    1

    return  当该关键字出现在main函数中时候可以结束进程
            如果在其他函数中则表示结束该函数。
    exit -> 刷新缓存区 -> atexit注册的退出函数 -> _exit
    
    2._exit    系统调用
    void _exit(int status);
    功能:
        让进程退出,不刷新缓存区
    参数:
        status:进程退出状态
    返回值:
        缺省
 

3.进程空间的回收wait/waitpid
    

exit(20);
    
wait/waitpid

    pid_t wait(int *status);
功能:该函数可以阻塞等待任意子进程退出
      并回收该进程的状态。
      一般用于父进程回收子进程状态。

参数:status 进程退出时候的状态
      如果不关心其退出状态一般用NULL表示
      如果要回收进程退出状态,则用WEXITSTATUS回收。

返回值:成功 回收的子进程pid
        失败 -1;
        
WIFEXITED(status)  是不是正常结束
   

WEXITSTATUS(status) 使用这个宏去那返回值

WIFSIGNALED(status) 是不是收到了信号而终止的
              

WTERMSIG(status)如果是信号终止的,那么是几号信号。
 

wait()

父进程使用wait后会等待子进程消亡后再跳转到wait位置开始回收后执行父后面程序。

异常信号结束

waitpid

一直循环扫描检测,直至程序正常结束。

练习

exec函数族

execl()

会搜索当前目录

execlp()

默认路径搜索系统路径,如果是系统命令(cat、ls 等)第一个可以输入”cat“就行,这就是与execl的区别,自己的可执行程序需要完整路径。

execv

会搜索当前路径,execv和execvp区别是函数第一个参数,路径直接写入和传入args[0]

execvp

只会搜索系统路径path

这篇关于进程(2) wait、exec函数族的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091679

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注