头歌(Linux之进程管理一):第4关:进程终止

这篇具有很好参考价值的文章主要介绍了头歌(Linux之进程管理一):第4关:进程终止。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务描述

在上一关我们学习使用vfork函数创建新进程,并且使用exit来结束子进程,本关我们将介绍Linux系统中结束进程的其它方法。

本关任务:学习终止进程的常见方法。

相关知识

在上一关以及看到,开发人员使用vfork创建出来的子进程可以用exit函数来结束。在 Linux 环境中,一个进程的结束,可以通过调用相应的函数实现,也可以是接收到某个信号而结束。

常见与退出进程相关的函数有:exit_exitatexiton_exitabortassert

  1. exit函数是标准C库中提供的函数,它用来终止正在运行的程序,并且关闭所有I/O标准流。
  2. _exit函数也可用于结束一个进程,与exit函数不同的是,_exit不会关闭所有I/O标准流。
  3. atexit 函数用于注册一个不带参数也没有返回值的函数以供程序正常退出时被调用。
  4. on_exit 函数的作用与atxeit函数十分类似,不同的是它注册的函数具有参数,退出状态和参数arg都是传递给该程序使用的。
  5. abort 函数其实是用来发送一个SIGABRT信号,这个信号将使当前进程终止。
  6. assert是一个宏。调用assert时,它将先计算参数表达式 expression的值,如果为0,则调用abort函数结束进程。

头歌(Linux之进程管理一):第4关:进程终止,头歌-Linux,linux,运维,服务器

[exit_exit区别]

以上关于退出处理函数中只有_exit是系统调用函数,因此使用man 2 _exit来查看其使用方法,而其余函数都是库函数,因此使用man 3 函数名来查看其使用方法。

exit_exit使用方法

exit函数的具体的说明如下:

  • 需要的头文件如下:
    1. #include <stdlib.h>
  • 函数族格式如下:
    1. void exit(int status);
    参数说明: status:设置程序退出码;

_exit函数的具体的说明如下:

  • 需要的头文件如下:

    1. #include <unistd.h>
  • 函数族格式如下:

    1. void _exit(int status);

    参数说明: status:设置程序退出码;

  • 函数返回值说明: exit_exit均无返回值。

atexiton_exit使用方法

atexiton_exit函数的具体的说明如下:

  • 需要的头文件如下:

    1. #include <stdlib.h>
  • 函数族格式如下:

    1. int atexit(void (*function)(void));
    2. int on_exit(void (*function)(int , void *), void *arg);

    参数说明: atexit函数的function参数是一个函数指针,指向无返回值和无参数的函数; on_exit函数的function参数是一个函数指针,指向无返回值和有两个参数的函数,其中第一个参数是调用exit()或从main中返回时的值,参数arg指针会传给参数function函数;

  • 函数返回值说明: atexiton_exit调用成功返回0;调用失败返回一个非零值。

注意:atexiton_exit只有在程序使用exit或者main中正常退出时才会有效。如果程序使用_exitabortassert退出程序时,则不会执行被注册的函数。

案例演示1: 使用atexit注册一个退出函数,使其在调用退出函数前被执行,详细代码如下所示:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. void out()
  4. {
  5. printf("程序正在被退出\n");
  6. }
  7. int main()
  8. {
  9. if(atexit(out) != 0)
  10. {
  11. printf("调用atexit函数错误\n");
  12. }
  13. return 0; //或者exit(0)
  14. }

头歌(Linux之进程管理一):第4关:进程终止,头歌-Linux,linux,运维,服务器

将以上代码保存为atexit.c文件,编译执行。可以看到执行atexit程序后,out函数被调用。

案例演示2: 使用on_exit注册一个退出函数,使其在调用退出函数前被执行,详细代码如下所示:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. void out(int status, void *arg)
  4. {
  5. printf("%s(%d)\n", (char *s)arg, status);
  6. }
  7. int main()
  8. {
  9. if(on_exit(out, "程序正在被退出") != 0)
  10. {
  11. printf("调用on_exit函数错误\n");
  12. }
  13. exit(1); //或者return 1
  14. }

头歌(Linux之进程管理一):第4关:进程终止,头歌-Linux,linux,运维,服务器

将以上代码保存为on_exit.c文件,编译执行。可以看到执行on_exit程序后,out函数被调用,并且status变量的值就是exit函数退出的值。

abortassert使用方法

abort函数的具体的说明如下:

  • 需要的头文件如下:
    1. #include <stdlib.h>
  • 函数族格式如下:
    1. void abort(void);

assert宏的具体的说明如下:

  • 需要的头文件如下:
    1. #include <assert.h>
  • 函数族格式如下:
    1. void assert(scalar expression);
    参数说明: expression:需要被判断的表达式;

注意:assert宏通常用于调试程序。

  • 函数返回值说明: abortassert无返回值。

案例演示1: 使用abort终止一个程序,详细代码如下所示:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. int main()
  4. {
  5. printf("Hello world\n");
  6. abort();
  7. }

头歌(Linux之进程管理一):第4关:进程终止,头歌-Linux,linux,运维,服务器

将以上代码保存为abort.c文件,编译执行。可以看到执行abort程序后,程序被强行终止。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全exitProcess函数,使用atexit函数注册一个函数,在注册函数中打印出当前进程的ID号。

测试说明

本关的测试需要用户在右侧代码页中补全代码,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果。

#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>

/************************
 * 提示: 用户需要在exitProcess函数中使用atexit函数注册一个自定义函数,并在自定义函数中打印出当前进程ID号
*************************/
void out()
{
    printf("%d\n",getpid());
}
void exitProcess()
{
	/********** BEGIN **********/
    if(atexit(out)!=0)
    {
        printf("调用atexit函数错误\n");
    }
}

 文章来源地址https://www.toymoban.com/news/detail-715658.html

到了这里,关于头歌(Linux之进程管理一):第4关:进程终止的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 常用操作命令(CentOS 7.0)- 故障定位:服务器负载、进程管理、日志分析

    系统经研发测试上线后,如果运行期间出现了BUG,需要对服务故障进行定位,一般会查看服务器负载、服务状态、进程管理、服务日志等。 本文以CentOS 7.0 操作系统上的命令操作作为示例进行记录。 #服务器负载 完整参见:http://www.laobingbiji.com/note/detail.html?note_id=20231115154337

    2024年01月17日
    浏览(65)
  • 头歌Linux 远程联机服务(一)- Telnet服务器

    目录 第1关:安装Telnet 编程要求 预期输出:  输入: 第2关:Telnet服务器启动/关闭 编程要求 预期输出:启动成功 输入:  第3关:Telnet远程登录 编程要求 预期输出: 输入:  在右侧命令行中在线安装 Telnet 服务器软件和客户端软件: 在线安装 telnet 服务器软件(实验环境使

    2024年02月01日
    浏览(48)
  • 头歌实验10-3:Linux 远程联机服务(三)- SSH服务器

    上答案 还是下载 上答案 上答案 我是改的判定文件 键盘输入ggdG 键盘输入i 点击[Esc] 键盘输入 :wq

    2024年02月03日
    浏览(42)
  • 头歌实验10-1:Linux 远程联机服务(一)- Telnet服务器

    任务: 1,安装Telnet客户端 2,安装Telnet服务器 上答案: 按以下输入便是: 补充说明: 如果出现了这种情况, 直接输入y 任务 打开Telnet服务 上答案: 如果你退出了头歌,那么你需要再次执行 然后 就好了。 任务 新创建一个用户testUser; 为用户testUser设置密码; 使用telnet去

    2024年02月04日
    浏览(58)
  • 【Linux】详解进程终止&&进程等待

             页表中不仅仅只有虚拟地址到物理地址的映射,还包括了很多选项,其中就包括了映射条目的权限。当我们进程的代码和数据加载到内存并和进程地址空间建立映射关系时,如果数据的内容不允许被修改(比如说常量字符串),对应数据在页表中的映射条目的权

    2024年04月14日
    浏览(61)
  • Linux——进程创建与进程终止

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 #include unistd.h pid_t fork(void); 返

    2024年02月04日
    浏览(48)
  • 【Linux进程控制】进程创建 | 进程终止 | 进程等待 | 进程替换

    【写在前面】 本文主要学习理解 fork 的返回值、写时拷贝的工作细节、为什么要存在写时拷贝;进程退出码、进程退出的场景及常见的退出方法、对比 man 2 _exit 和 man 3 exit;进程终止、操作系统怎么进行释放资源、池的概念;进程等待的价值、进程等待的方法 wait 和 waitpid

    2023年04月08日
    浏览(36)
  • Linux进程终止

    其实进程终止不外乎就以下三种情况: 我们一般关心程序为什么会失败而不关心为什么会成功。换句话说操作系统如何判断程序运行成功呢? 一般在程序末尾返回0以确定程序运行成功 。而这个0会被父进程bash接收。 打印返回码 可以通过 echo $? 查看最近进程退出码。 例如将

    2024年02月07日
    浏览(31)
  • 【Linux初阶】fork进程创建 & 进程终止 & 进程等待

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:fork进程创建,理解fork返回值和常规用法,进程终止(退出码、退出场景、退出方法、exit),进程等待(wait、waitpid),阻塞等待和非阻塞等待 🚢🚢作者简介:本科在读,计算机海洋

    2024年02月06日
    浏览(47)
  • 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    柴犬: 你好啊,屏幕前的大帅哥or大美女,和我一起享受美好的今天叭😃😃😃 1. 在调用fork函数之后, 当执行的程序代码转移到内核中的fork代码后 ,内核需要分配 新的内存块 和 内核数据结构 给子进程, 内核数据结构包括PCB、mm_struct和页表,然后构建起映射关系 ,同时

    2024年01月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包