头歌(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函数结束进程。

[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. }

将以上代码保存为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. }

将以上代码保存为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. }

将以上代码保存为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");
    }
}

 

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 进程控制是指对Linux系统中正在运行的进程进行管理和控制的过程。包括创建、终止、挂起、恢复、调度、优先级等操作。通过进程控制,可以实现对系统资源的合理分配和利用,提高系统的稳定性和效率。在Linux系统中,进程控制是非常重要的一部分,也是Linux系统的核心功能之一。 ### 回答2: Linux进程控制是Linux操作系统中一个非常重要的功能,它允许用户对进程的行为进行监控、控制和管理。 首先,对进程的监控是通过系统提供的进程管理工具实现的,如top命令可以查看进程的CPU使用率和内存使用率;ps命令可以列出当前运行的所有进程;kill命令可以强制终止某个进程。这些命令可以帮助用户了解进程的执行状态,及时发现并解决进程执行过程中遇到的问题。 其次,进程控制指的是用户可以通过发送信号的方式,向进程发出指令,要求其执行相应的操作。Linux操作系统提供了许多信号,用户可以借助这些信号来对进程进行控制,如SIGHUP信号可以通知进程重新读取其配置文件;SIGKILL信号可以直接结束进程。发送信号的命令主要有kill和pkill。 最后,进程管理是通过各种命令和工具来实现,比如系统日志,top命令和ps命令。系统管理员可以利用这些工具监控系统中运行的所有进程,查找哪个进程占用内存或CPU过多,给这个进程发送信号或者结束它的运行。 总之,Linux进程控制是Linux操作系统中一个重要的功能,它可以帮助用户了解进程的运行状态,以及及时发现和排查进程执行过程中的故障。用户可以通过信号的方式对进程进行控制,从而达到更加高效、稳定和安全的系统运行。 ### 回答3: 进程控制是操作系统的核心功能之一,它能决定着一个系统的性能和可靠性。在Linux中,进程控制可以通过各种系统调用函数来实现。下面我们分几个方面介绍一下头歌Linux中的进程控制。 1. 进程创建和销毁:Linux中的进程创建可以通过fork()函数和exec()函数来实现。fork()函数能够创建一个与父进程完全一样的子进程,并且这个子进程会从fork()函数之后开始执行。而exec()函数则是用来改变当前进程的镜像,也就是说,我们可以通过exec()函数让一个进程变成另外一个进程,同时可以传递参数给新的进程进程销毁则是通过exit()函数来完成的,它会让当前进程退出,并且清理分配给它的所有资源。 2. 进程状态:在Linux中,进程有五种状态,分别是创建(未连结状态)、就绪(等待 CPU 执行状态)、运行(CPU 执行状态)、阻塞(等待资源状态)和终止状态。可以用ps命令查看进程的状态。 3. 进程进程控制:在头歌Linux中,进程可以通过各种系统调用函数来控制其他进程。比如向其他进程发送信号,可以使用kill()函数。向其他进程发送数据,则可以使用管道(pipe)或者消息队列(message queue)等方式。 4. 进程调度:在头歌Linux中,调度器(scheduler)会根据进程的优先级,以及进程所占用的资源情况来实现进程调度。同时,调度器还会根据每个进程运行的时间切片,来防止某些进程占用CPU过久,从而导致系统变慢。 总的来说,进程控制在头歌Linux中非常重要,它决定着系统的稳定性和性能。我们可以通过各种系统调用函数来实现进程控制,并且可以根据自己的需求来灵活地控制进程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值