返回顶部
首页 > 资讯 > 操作系统 >Linux被中断的系统如何调用详解
  • 777
分享到

Linux被中断的系统如何调用详解

linux系统调用linux系统调用汇总linux中断系统 2022-06-04 23:06:04 777人浏览 八月长安
摘要

前言 慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept、无输入时的read都属于慢速系统调用。 在linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会

前言

慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept、无输入时的read都属于慢速系统调用。

linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断的系统调用。

然而,当信号处理函数返回时,有可能发生以下的情况:

  • 如果信号处理函数是用signal注册的,系统调用会自动重启,函数不会返回
  • 如果信号处理函数是用sigaction注册的
    • 默认情况下,系统调用不会自动重启,函数将返回失败,同时errno被置为EINTR
    • 只有中断信号的SA_RESTART标志有效时,系统调用才会自动重启

下面我们编写代码,分别验证上述几种情形,其中系统调用选择read,中断信号选择SIGALRM,中断信号由alarm产生。

使用signal


#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

void handler(int s)
{
  printf("read is interrupt by signal handler\n");
  return;
}

int main()
{
  char buf[10];
  int nread = 0;

  signal(SIGALRM, handler);
  alarm(2);

  printf("read start\n");
  nread = read(STDIN_FILENO, buf, sizeof(buf));
  printf("read return\n");

  if ((nread < 0) && (errno == EINTR))
  {
    printf("read return failed, errno is EINTR\n");
  }

  return 0;
}

使用sigaction + 默认情况


#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

void handler(int s)
{
  printf("read is interrupt by signal handler\n");
  return;
}

int main()
{
  char buf[10];
  int nread = 0;
  struct sigaction act;

  sigemptyset(&act.sa_mask);
  act.sa_handler = handler;
  act.sa_flags = 0; //不给SIGALRM信号设置SA_RESTART标志,使用sigaction的默认处理方式
  //act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT是sigaction的默认处理方式,即不自动重启被中断的系统调用
  //实际上,不管act.sa_flags值为多少,只要不设置SA_RESTART,sigaction都是按SA_INTERRUPT处理的

  sigaction(SIGALRM, &act, NULL);
  alarm(2);

  printf("read start\n");
  nread = read(STDIN_FILENO, buf, sizeof(buf));
  printf("read return\n");

  if ((nread < 0) && (errno == EINTR))
  {
    printf("read return failed, errno is EINTR\n");
  }

  return 0;
}


使用sigaction + 指定SA_RESTART标志


#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

void handler(int s)
{
  printf("read is interrupt by signal handler\n");
  return;
}

int main()
{
  char buf[10];
  int nread = 0;
  struct sigaction act;

  sigemptyset(&act.sa_mask);
  act.sa_handler = handler;
  act.sa_flags = 0;
  act.sa_flags |= SA_RESTART; //给SIGALRM信号设置SA_RESTART标志

  sigaction(SIGALRM, &act, NULL);
  alarm(2);

  printf("read start\n");
  nread = reGIgbFmad(STDIN_FILENO, buf, sizeof(buf));
  printf("read return\n");

  if ((nread < 0) && (errno == EINTR))
  {
    printf("read return failed, errno is EINTR\n");
  }

  return 0;
}


由于对被中断系统调用处理方式的差异性,因此对应用程序来说,与被中断的系统调用相关的问题是:

  • 应用程序无法保证总是知道信号处理函数的注册方式,以及是否设置了SA_RESTART标志
  • 可移植的代码必须显式处理关键函数的出错返回,当函数出错且errno等于EINTR时,可以根据实际需求进行相应处理,比如重启该函数

int nread = read(fd, buf, 1024);

if (nread < 0)
{
  if (errno == EINTR)
  {
    //read被中断,其实不应该算作失败,可以根据实际需求进行处理,比如重写调用read,也可以忽略它
  }
  else
  {
    //read真正的读错误
  }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

--结束END--

本文标题: Linux被中断的系统如何调用详解

本文链接: https://lsjlt.com/news/20647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux被中断的系统如何调用详解
    前言 慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept、无输入时的read都属于慢速系统调用。 在linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会...
    99+
    2022-06-04
    linux系统调用 linux系统调用汇总 linux中断系统
  • 详解linux系统调用原理
    操作系统通过系统调用为运行于其上的进程提供服务。 当用户态进程发起一个系统调用, CPU 将切换到 内核态 并开始执行一个 内核函数 。 内核函数负责响应应用程序的要求,例如操作文件、进行网络通讯或者申请内存资源等。 举...
    99+
    2022-06-04
    linux 调用
  • 如何判断Linux系统是否被非法进入
    如何判断Linux系统是否被非法进入,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。对于在线运行的业务系统,安全性是一个至关重要的问题。服务器被非法进入最常见的表...
    99+
    2023-06-16
  • 如何理解Linux系统中的进程调度
    这篇文章主要讲解了“如何理解Linux系统中的进程调度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Linux系统中的进程调度”吧!操作系统要实现多进程,进程调度必不可少。有人说,进...
    99+
    2023-06-12
  • 如何实现Linux系统调用
    今天小编给大家分享一下如何实现Linux系统调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2024-04-02
  • linux系统调用是如何实现的
    今天就跟大家聊聊有关linux系统调用是如何实现的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这张图画了挺久的,主要是想让大家可以从全局角度,看下linux内核中系统调用的实现。在...
    99+
    2023-06-15
  • 如何解决Linux系统80端口被占用的问题
    这期内容当中小编将会给大家带来有关如何解决Linux系统80端口被占用的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。有Linux在centos下面安装webmail服务遇到80端口被占用的问题,导致...
    99+
    2023-06-05
  • Linux系统中怎么判断是否被黑客入侵
    这期内容当中小编将会给大家带来有关Linux系统中怎么判断是否被黑客入侵,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux内核进程伪装了什么在Linux上,内核创建了许多线程来帮助完成系统任务,这些...
    99+
    2023-06-16
  • Java代码如何判断linux系统windows系统
    目录Java代码判断linux系统windows系统Java在Linux与windows系统下获取主板序列号,cpu序列号以及mac地址总结Java代码判断linux系统window...
    99+
    2023-01-10
    Java判断linux系统 Java判断windows系统
  • 如何使用Java调用Linux系统命令
    目录Java调用Linux系统命令java执行Linux命令,支持通配符(*)Java调用Linux系统命令 有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效...
    99+
    2024-04-02
  • Linux系统如何调整时区
    这篇文章主要介绍“Linux系统如何调整时区”,在日常操作中,相信很多人在Linux系统如何调整时区问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统如何调整时区”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-28
  • 如何调整Linux系统时区
    小编给大家分享一下如何调整Linux系统时区,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在进行Linux下修改时区的时候总是修改不了修改成 Asia/Shang...
    99+
    2023-06-28
  • win7系统主题被禁用如何解决
    这篇文章主要介绍了win7系统主题被禁用如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7系统主题被禁用如何解决文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2023-04-07
    win7
  • Linux操作文件的底层系统如何调用
    这篇文章主要介绍“Linux操作文件的底层系统如何调用”,在日常操作中,相信很多人在Linux操作文件的底层系统如何调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux操作文件的底层系统如何调用”的疑...
    99+
    2023-07-06
  • Linux系统中如何用SSH
    Linux系统中如何用SSH,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Linux系统中,使用SSH工具可以让我们连接到运行ssh服务的服务器上,也可以通过ssh控制我...
    99+
    2023-06-28
  • 如何理解Linux系统中的虚拟文件系统
    这篇文章主要介绍“如何理解Linux系统中的虚拟文件系统”,在日常操作中,相信很多人在如何理解Linux系统中的虚拟文件系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Linux系统中的虚拟文件系统...
    99+
    2023-06-12
  • Linux调试器中如何实现断点
    这篇文章将为大家详细讲解有关Linux调试器中如何实现断点,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。系列索引随着后面文章的发布,这些链接会逐渐生效。准备环境断点寄存器和内存Elves 和 dwarve...
    99+
    2023-06-28
  • Linux系统中如何更改I/O调度器
    本篇文章给大家分享的是有关Linux系统中如何更改I/O调度器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Linux I/O 调度器是Linux内核中的一个组成部分,是一个以...
    99+
    2023-06-28
  • Linux系统中rpm命令用法详解
            rpm命令来自于英文词组”RedHat Package Manager“的缩写,中文译为红帽软件包管理器,其功能是用于在Linux系统下对软件包进行安装、卸载、查询、验证、升级等工作。 语法格式: rpm [参数] 软件包 ...
    99+
    2023-09-02
    linux 服务器 运维 rpm
  • Linux系统中curl命令用法详解
            在Linux系统中curl是一个利用URL规则在命令行下工作的文件传输工具,是一款强大的http命令行工具。它支持文件的上传和下载,是综合传输工具。         curl 是常用的命令行工具,用来请求 Web 服务器。它...
    99+
    2023-09-04
    linux 运维 服务器 curl
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作