exit()与wait-()函数

数据分析案例-2024年裁员数据集可视化分析 本实验数据集来源于Kaggle,原始数据集为2020-2024年裁员数据,共有3577条,12个变量,该数据集提供了不同公司的裁员信息。它包括以下几栏:Company:裁员发生的公司名称。Location_HQ:公司总部位置。Industry:公司所属的行业或部门。Laid_Off_Count:公司解雇的员工数量。Percentage:公司员工被解雇的百分比。Date:裁员发生的日期。Source:信息来源网址。Funds_Raised:公司募集资金的信息。 阅读详情

这节的知识我就基本只是把书上的整理了一下, 仅仅只是个人觉得有用的整理了下。

exit()函数

  • _Exit() : 其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法
  • _exit() : _exit()由exit()调用,处理UNIX特定的细节
  • 最后一个进程调用return等其他终止的返回值并不作为进程的返回值. 当最后一个进程从启动例程返回时, 该进程以终止状态0返回.
  • 终止
不管进程是怎么终止的, 最后都会调用内核的同一段代码. 这段代码会关闭所有的流操作, 释放所使用的存储器.
在异常终止时, 系统会返回一个异常终止状态.
父进程通过wait()watipid()函数来获得终止状态.
在最后调用exit()时, 转化为终止状态
在父进程比子进程先终止时,父进程会改变为init进程(也是之前说的init会成为所有孤进程的父进程(原因 :在进程终止时, 内核逐个检查所有活动的进程, 以判断是不是正要终止进程的子进程, 如果是, 则该进程的父进程ID改为1.)
由init收养的父进程是不会变为僵尸进程的(僵尸进程 : 一个已终止, 但是其父进程没有对其做善后处理)

wait*()函数

wait()

  1. pid_t wait(int *statloc)
    • 子进程运行时, wait使调用者堵塞
    • statloc != NULL 则进程的终止状态就存放在其所指的单元, statloc == NULL 则不关心其终止状态
    • 当一个子进程终止就立刻返回。

waitpid()

  1. pid_t waitpid(pid_t pid, int *statloc, int options)
    • 可以并不堵塞
    • 可以等待pid指定的进程终止在执行waitpid()的调用者。
    • statloc != NULL 则进程的终止状态就存放在其所指的单元, statloc == NULL 则不关心其终止状态
    • pid的值
      pid == -1 等待任意子进程
      pid > 0 等待 “进程ID == pid” 的进程
      pid == 0 等待 ”组ID == 调用进程组ID”的任意进程
      pid < -1 等待 “组ID == |pid|“ 的进程

如果一个进程fork一个子进程, 但是想等待子进程终止再进行, 也不希望子进程处于僵尸状态直到父进程终止, 这就需要调用两次fork() (通俗一点就是希望父进程在子进程之前终止)

  1. /*************************************************************************
  2. > File Name: fork_wait_子进程.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年01月30日 星期二 11时23分27秒
  6. pid_t waitpid(pid_t pid, int *statloc, int options)
  7. 可以并不堵塞
  8. 可以等待pid指定的进程终止在执行waitpid()的调用者。
  9. statloc != NULL 则进程的终止状态就存放在其所指的单元, statloc == NULL 则不关心其终止状态
  10. pid的值
  11. pid == -1 等待任意子进程
  12. pid > 0 等待 “进程ID == pid” 的进程
  13. pid == 0 等待 ”组ID == 调用进程组ID”的任意进程
  14. pid < -1 等待 “组ID == |pid|“ 的进程
  15. ************************************************************************/
  16. #include <stdio.h>
  17. #include "apue.h"
  18. #include <sys/wait.h>
  19. int main(void)
  20. {
  21. // pid_t pid = -1;
  22. pid_t pid;
  23. if((pid = fork()) < 0)
  24. err_sys("fork error");
  25. else if(pid == 0)
  26. {
  27. if((pid = fork()) < 0)
  28. err_sys("fork error");
  29. else if(pid > 0)
  30. exit(0);
  31. sleep(2);
  32. printf("second child, parent pid = %ld\n", (long)getppid());
  33. exit(0);
  34. }
  35. if(waitpid(pid, NULL, 0) != pid)
  36. err_sys("waitpid error");
  37. exit(0);
  38. }
  39. /* 样例
  40. [root@192 Process]# ./a.out
  41. [root@192 Process]# second child, parent pid = 1
  42. [root@192 Process]#
  43. */
宏说明
WIFEXITED正常终止(真)可执行WEXITSTATUS 来获取子进程传递给exit, _exit参数
WIFSIGNALED异常终止(真)可执行WTERMSIG 获取子进程终止的信号编号
WIFSTOPPED暂停子进程的返回的状态(真)WSTOPSIG 获取子进程暂停的信号编号
  1. /*************************************************************************
  2. > File Name: exit__退出状态.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年01月31日 星期三 21时40分13秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include "apue.h"
  9. #include <sys/wait.h>
  10. void pr_exit(int status)
  11. {
  12. // 正常终止
  13. if(WIFEXITED(status))
  14. printf("normal termination, exit status = %d\n", WEXITSTATUS(status));
  15. // 异常终止
  16. else if(WIFSIGNALED(status))
  17. printf("abnormal termination, signal number = %d%s\n", WTERMSIG(status),
  18. #ifdef WCOREDUMP
  19. WCOREDUMP(status) ? " (core file generated)" : "");
  20. #else
  21. "");
  22. #endif
  23. // 暂停子进程
  24. else if(WIFSTOPPED(status))
  25. printf("child stopped, signal number = %d", WSTOPSIG(status));
  26. }
  27. int main(void)
  28. {
  29. pid_t pid;
  30. int status;
  31. // 1
  32. if((pid = fork()) < 0)
  33. err_sys("fork error");
  34. else if(pid == 0)
  35. exit(7);
  36. if(wait(&status) != pid)
  37. err_sys("wait error");
  38. pr_exit(status);
  39. // 2
  40. if((pid = fork()) < 0)
  41. err_sys("fork error");
  42. else if(pid == 0)
  43. abort();
  44. if(wait(&status) != pid)
  45. err_sys("wait error");
  46. pr_exit(status);
  47. // 3
  48. if((pid = fork()) < 0)
  49. err_sys("fork error");
  50. else if(pid == 0)
  51. status /= 0;
  52. if(wait(&status) != pid)
  53. err_sys("wait error");
  54. pr_exit(status);
  55. exit(0);
  56. }
  57. /* 样例
  58. ./a.out
  59. normal termination, exit status = 7
  60. abnormal termination, signal number = 6 (core file generated)
  61. abnormal termination, signal number = 8 (core file generated)
  62. */

竞争条件

竞争条件 : 当多个进程对共享数据进行某种处理, 但是最后结果又得取决于进程运行的顺序。(通俗一点就是运行还得看系统的调度顺序)

轮询:等待父进程终止在进行子进程。(消耗cpu资源)

  1. while(getppid != 1)
  2. sleep(1);

竞争条件的程序

  1. /*************************************************************************
  2. > File Name: TELL_WAIT_竞争条件.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年01月31日 星期三 22时38分46秒
  6. int putc(int ch, FILE *stream);
  7. 参数ch表示要输入的位置,参数stream为要输入的流。
  8. 若正确,返回输入的的字符,否则返回EOF。
  9. ************************************************************************/
  10. #include <stdio.h>
  11. #include "apue.h"
  12. static void charatatime(char *);
  13. int main(void)
  14. {
  15. pid_t pid;
  16. // 修改方法2
  17. // TELL_WAIT();
  18. // 修改方法1
  19. // if((pid = vfork()) < 0) 没有竞争关系了, 因为先进行子进程
  20. if((pid = fork()) < 0)
  21. err_sys("fork error");
  22. else if(pid == 0)
  23. {
  24. // 修改方法2
  25. // WAIT_PARENT();
  26. charatatime("one chile\n");
  27. }
  28. else
  29. {
  30. // 修改方法2
  31. // TELL_CHILD(pid);
  32. charatatime("first parent\n");
  33. }
  34. exit(0);
  35. }
  36. static void charatatime (char *str)
  37. {
  38. char *ptr;
  39. int c;
  40. setbuf(stdout, NULL);
  41. for(ptr = str; (c = *ptr++) != NULL; )
  42. putc(c, stdout);
  43. }
  44. /* 样例
  45. [root@192 Process]# ./a.out
  46. first oparent
  47. ne chile
  48. [root@192 Process]# ./a.out
  49. first paronent
  50. e chile
  51. [root@192 Process]# ./a.out
  52. first parenot
  53. ne chile
  54. */

每次的结果不一样, 因为这个要跟此时的进程顺序有关。
书上的修改方法2运行有问题, 因为那些函数没有包含进去, 所以无法测试。

看样子导出html格式代码就都有高亮了。
VMware使用Windows、WinXP等虚拟机上不了网的解决办法(管用) 这个情况一般出现在可以插网线的电脑上,比如台式机和有网线插口的笔记本。需要转换器才能插网线的笔记本一般不会出现这种情况. 查看主机的IP地址和虚拟机的IP地址是否在同一网段,如果在的话,虚拟机就能上网了!!(备注:虚拟机中的IP地址一定要和主机中的用来上网的那个连接的IP地址相同哦)。 阅读详情

相关推荐

Keil C51里用printf打印数据,为啥总出乱码?手把手教你%bd、%hd、%ld的正确用法

本文深入解析Keil C51中printf打印数据出现乱码的根本原因,并提供格式符%bd、%hd、%ld的正确用法指南。通过详细的调试技巧和实战案例,帮助开发者解决串口输出问题,提升单片机开发效率。

weixin_26854829的博客 281

Linux下的exit函数和wait函数

exit函数 无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。 如果一个进程已经终止,而其父进程没有对其进行处理(获得终止信息,释放资源),那么它将变成僵尸进程,在编写长期运行的程序时,尤其要注意这一点。 wait函数 wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait(

atinybirdinit的专栏 6410

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

关于wait 和 exit

照着书上来的 大概理解一下这两个的作用 首先是exit 就是只一个程序执行完毕 然后将返回值存储到pcb中 然后主动调用exit 退出程序 然后由内核去回收页框 emmm 然后是wait wait从字面意思来讲就是等待 父进程通过wait 来将自己阻塞 然后系统会去执行子进程 子进程执行结束后 会将pid返回给内核 内核再将pid给父进程 并唤醒父进程 这里引申出来的就是孤...

weixin_30783629的博客 454

Windows 下安装 Hermes Agent 完整教程(含踩坑记录)

不支持原生 Windows,必须通过 WSL2 (Windows Subsystem for Linux 2) 运行。WSL2 是 Windows 内置的 Linux 兼容层,可以在 Windows 上运行完整的 Linux 环境。

weixin_50191542的博客 4278

UE5实战:如何用Georeference插件搞定百度地图坐标转换(附完整代码)

本文详细解析了在UE5中使用Georeference插件实现百度地图坐标转换的全流程,包括BD-09到UE内部坐标的转换算法、UTM投影配置及性能优化技巧。通过完整代码示例和实战案例,帮助开发者高效解决数字孪生项目中的地理坐标转换难题。

weixin_30955617的博客 94

Linux环境下wait函数,Linux的exit()和wait()系统调用

Linux的exit()是进程退出用的,wait()则是父进程用来回收已退出的子进程的资源的。进程已经调用了exit()退出,而父进程还没有调用wait()回收资源的状态,就是僵尸状态(task zombie)。这时该进程已经不能运行,但还占着待回收资源。先看看这两个函数的man手册介绍,exit的参数是退出状态码,一般正常退出传0,出错退出传-1,无返回值,因为进程调用了exit()之后就不再返...

weixin_35006125的博客 1689

BGP路由聚合:自动聚合和手动聚合

路由聚合是指将多条具体的路由合并为一条聚合路由,以减少路由表的条目数。这种技术通过只向对等体发送聚合后的路由,而不发送所有的具体路由,来减小路由表的规模。同时,被聚合的路由如果发生路由振荡,也不再对网络造成影响,从而提高了网络的稳定性。

网络技术联盟站 1220

Linux 下进程属性(fork、exit、wait、execve)/进程控制函数/虚拟地址/内存管理方式/缺页中断的概念详解

进程的属性 1.进程标识符(PID): 进程描述task_struct 结构体中的 pid 字段可以唯一标识一个进程,称为进程标识符PID。进程最主要的属性就是进程号(PID)和它的父进程号(PPID),两者都是非零正整数。每个进程的PID不会相同,系统调用 getpid 来获得进程标识符。 一个PID唯一地标识一个进程。一个进程创建一个新进程称为创建子进程,创建子进程的进程称为父进程。所有的进程......

m1059247324的博客 1718

搞懂 ABAP 里的 Language Settings:登录语言、文本环境语言与 sy-langu 的真实含义

SAP系统中语言设置并非单一字段决定,而是由登录语言(logon language)和文本环境语言(text environment language)共同控制。登录语言在会话期间固定,而文本环境语言可通过SET LOCALE语句修改,影响文本处理、排序、异常显示等行为。开发中需区分两者:使用CL_ABAP_SYST方法获取登录语言,通过sy-langu或GET LOCALE获取当前文本环境语言。语言环境切换应谨慎处理并尽快恢复,避免影响会话中其他程序。在多语言场景下,正确处理语言设置对确保文本相关功能正常

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1307

电子凸轮追剪算法深度解析:2500字图解+代码实战

工艺需求:在物料连续运动过程中完成精准切割核心矛盾:切割瞬间刀具与物料必须绝对同步传统方案:机械凸轮(结构复杂,调整困难)现代方案:电子凸轮(柔性可调,精度更高)

QQ_778132974的博客 1111

UNIX再学习 -- exit 和 wait 系列函数

我们一开始讲进程环境时,就有提到了。进程有 8 种方式使进程终止。其中 5 种为正常终止,它们是:(1)在 main 函数中执行 return(2)调用 exit 函数,并不处理文件描述符,多进程(3)调用 _exit 或 _Exit(4)最后一个线程从其启动例程返回(5)从最后一个线程调用 pthread_exit异常终止有 3 种方式,它们是:(6)调用 abort,产生 SIGABRT 信号

不积跬步,无以至千里 5865

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

exit() 和 wait() 函数的用法

函数用于终止当前进程的执行,并返回状态码给其父进程。函数用于父进程等待子进程的终止,并获取子进程的终止状态。

m0_50502677的博客 758

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

linux execl函数 errno,过程控制 Linux C fork() execl() exit() wait()

进程控制 Linux C fork() execl() exit() wait()进程控制实验:在linux下面使用c语言利用系统调用fork(), execl(), exit(), wait()fork()用来复制进程int fork() turns a single process into 2 identical processes, known as the parent and the...

weixin_32929205的博客 332

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux下编写一个关于运用进程函数fork(),sleep(),wait(),exit()的C程序(●----●)

Hi,百无聊赖写blog。本文所涉及的所有内容是存在笔者没有发现的错误的,所以请以批判的角度阅读,希望高手留下珍贵的留言,于此感激不尽。 然后,这些是记录笔者个人对有关知识点的认知和理解,希望在recording的同时,能够提高我的英语词汇运用,也能够将自己对C语言的热爱,开源和分享的思想在社区传播。 Alright!Nonsense is over,let's get into the co...

weixin_41741302的博客 2158

LINUX进程常用函数exit() wait() atexit() wexitstatus() fork()

LINUX进程常用函数exit() wait() atexit() wexitstatus() fork(); #include <stdio.h> #include <stdlib.h> #include <sys/types.h> 1. List item #include <unistd.h> #include <sys/wait.h> void dad_ps(void) { printf("hahahah\n"); }

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 216

exit()与_exit()函数wait与waitpid及孤儿僵尸

注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点。 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #define __...

706

信号、进程、execve(),wait(),waitpid(),exit()函数

Shell 描述 命令解释器,介于操作系统内核态和用户态之间。 两种作业执行模式 后台作业:命令以&结束,在后台执行,运行任意数量的作业。 前台作业:等待作业终止后才能输入下一个命令,最多只能运行一个作业。 信号 信号的来源 从内核发送到一个进程,通知用户进程发生该异常。 信号的捕获处理 1.忽略此信号 2.执行该信号的默认处理动作 3.按提供的信号处理函数 信号的类型 1-31信号称之为普通信号, 34-64信号称之为实时信号。 常见信号: SIGCHLD:子进程状态改变后产生信号发父进程,父进

xiao_bai_12138的博客 663

fork()系统调用

在Linux系统内,创建子进程的方法是使用系统调用fork()函数。fork()函数是Linux系统内一个非常重要的函数,它与我们之前学过的函数有一个显著的区别:fork()函数调用一次却会得到两个返回值。

薛铁钢的博客 1919

exit() _exit()

_exit()不进行清理工作,直接结束进程进入到内核中 exit()清理I/O缓冲区后再退出进程 return函数返回,在main函数中return相当于调用exit 传递给exit的参数为退出状态。 Q:子进程在父进程fork之后产生,父进程可以通过wait函数获得子进程的终止状态,但是如果父进程在子进程之前终止了怎么办? A:对于父进程终止的子进程,他们的父进程将变为init进程,我们称...

princeteng's blogs 178

《Linux系统编程篇》fork/wait/waitpid/exit函数——基础篇

在 Linux 中,所有的进程都是通过 fork() 派生而来。当一个进程调用 fork() 时,操作系统会复制当前进程的上下文,为它创建一个几乎完全相同的副本,这个副本被称为子进程,而原始进程被称为父进程。这也是人们口中的父子进程的概念。

Strange_Head的博客 1809

fork()函数_UNIX环境高级编程(APUE)系列学习第8章-2 exit系列函数与wait系列函数...

5 函数exitexit函数、_exit函数和_Exit函数。在7.3节中介绍了5中进程的正常终止和3种异常终止的方法。 但是无论进程如何终止,最后都会执行内核中的同一段代码。折断代码为相应进程关闭所有打开描述符,释放它所使用的存储器。 并且对于任意一种终止情形,我们都希望终止进程能通知其父进程它是如何终止的。 对于三个终止函数(exit、_exit和_Exit),实现将终止进程通知其父类的方法是...

weixin_39608478的博客 96

进程(2) wait、exec函数族

父进程使用wait后会等待子进程消亡后再跳转到wait位置开始回收后执行父后面程序。一直循环扫描检测,直至程序正常结束。

2201_75286049的博客 1138

C C++最新Linux 进程控制相关函数_void exit(int status),字节跳动面试真题

库函数和系统调用接口的关系:库函数封装了系统调用接口,原因是系统调用接口对用户不太友好。这三种终止进程的方式有什么不同呢?returnreturn虽然printf()函数在sleep的前面,但是打印并没有换行。也就是没有手动刷新缓冲区,所以直到运行5秒后,return进程结束才会刷新缓冲区,打印hello WhiteShirtI。exit()exit()_exit():程序崩溃,由于某种错误导致程序没运行完就突然退出。

2401_84976222的博客 624

Linux应用编程---3.wait()函数

​ wait()函数用来等待进程结束,或者说是进程状态改变,属于阻塞式等待。如果等待到子进程终止,返回该进程的id,如果函数调用失败,则返回-1。linux终端下可以向main函数传参,也就是声明main函数时,入口写为这样:int main(int * argc, char *argv[])。其中,argc代表入参的个数,argv代表入参。

shiyuanxuan369的博客 1541
上一篇: 进程控制之fork()与vfork()函数
下一篇: apue.h头文件
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值