一、进程与信号之中断系统调用

进程“慢”系统调用,如果发生了信号,内核会重启系统调用

慢系统调用:

  可能会永远阻塞的系统调用

  从终端设备,管道,或者网络设备上的文件读取

  向上述文件写入

  某些设备上的文件打开

  pause和wait系统调用

  一些设备ioctl操作

  一些进程间通信函数

系统中断调用信号处理函数重新执行

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

void set_signal(int signo)
{
    printf("set signal %d\n",signo);
}

int main()
{
    char buffer[512];
    ssize_t size;

    if(signal(SIGTSTP,set_signal)==SIG_ERR)
    {
        printf("signal error\n");
    }

    printf("main start reading a file\n");

    size=read(STDIN_FILENO,buffer,512);
    if(size <0)
    {
        printf("reading error\n");
    }
    printf("reading finished\n");
    if(write(STDIN_FILENO,buffer,size)!=size)
    {
        printf("write error\n");
    }
    return 0;
}

用户函数调用,信号处理函数未重新执行

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

void set_signal(int signo)
{
    printf("signal call %d\n",signo);
}

void user_call()
{
    printf("user run start\n");
    sleep(10);
    printf("user run end\n");
}

int main()
{
    if(signal(SIGTSTP,set_signal)==SIG_ERR)
    {
        printf("set signal error");
    }
    printf("main start\n");
    user_call();
    printf("mian end\n");
}

不可重入函数:

  使用了全局变量或者静态变量

可重入函数:

  全部内部变量

时间: 2024-08-26 05:33:40

一、进程与信号之中断系统调用的相关文章

Linux环境编程之信号(二):不可靠信号、中断的系统调用、可重入函数

(一)不可靠信号 对前面说的信号,是不可靠的,不可靠指的是信号可能会丢失:一个信号发生了,但进程却可能一直不知道这一点.另外,进程对信号的控制能力有限,只能捕捉信号或忽略它.有时用户希望通知内核阻塞一个信号:不要忽略它,在其发生时记住它,然后在进程做好准备时再通知它.这种阻塞信号的能力并不具备. 之前的版本中村咋一个问题:在进程每次接到信号对其进行处理时,随即将该信号动作复位为默认值.另一个问题是,在进程不希望某种信号发生时,它不能关闭该信号.进程能做的一切就是忽略该信号. (二)中断的系统调用

Unix环境编程之定时、信号与中断

在linux下实现精度较高的定时功能,需要用到setitimer 和 getitimer函数. 函数原型: #include <sys/time.h> int getitimer(int which, struct itimerval *curr_value); int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); · 函数getitimer()把指定的定时器类型( I

linux程序设计——进程和信号总结(第十一章)

11.4.2    信号集 头文件signal.h定义了类型sigset_t和用来处理信号集的函数.sigaction和其他函数.sigaction和其他函数将用这些信号集来修改进程在接收到信号时的行为. #include <signal.h> int sigaddset(sigset_t *set, int signo); int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigdelset(sigset_t

linux程序设计——进程和信号(第十一章)

11.4.1    发送信号 进程可以通过调用kill函数向包括它本身在内的其他进程发送一个信号.如果程序没有发送该信号的权限,对kill函数的调用就将失败,失败的常见原因是目标进程由另一个用户所拥有.这个函数和同名的shell命令完成相同的功能,它的定义如下所示: #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); kill函数把参数sig给定的信号发送给参数pid给出的进程号所指定的进

初步理解Python进程的信号通讯

Reference: http://www.jb51.net/article/63787.htm 信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT     终止进程  中断进程  (control+c) SIGTERM   终止进程     软件终止信号 SIGKILL   终止进程     杀死进程 SIGALRM 闹钟信号进程结束信号 SIGTERM和SIGKILL的区

进程-IPC 信号和信号量 (二)

详细见:  https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%BA%8C).md 三 信号 3.1. 信号简介 信号是进程之间互相传递消息的一种方法,信号全称为软中断信号,也可称为软中断,它是实现IPC的方法之一. 信号是UNIX和Linux系统响应某些条件而产生的一个事件.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件. 注:信号只是简单用来通知某进程发生了什么

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> 参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了 Linux 传统的进程间通信有很多,如各类管道.消息队列.内存共享.信号量等等.但它们都无法介于内核态与用户态使用,原因如表 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在

2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

 1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默认Term动作 a signal handling function 进程处理信号 A默认处理动作 term   中断 core    core(调试的时候产生) gcc –g file.c ulimit –c 1024 gdb a.out core ign      忽略 stop     停止

Android -- Init进程对信号的处理流程

Android -- Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号.父进程收到该信号后,会释放分配给该子进程的系统资源:并且父进程需要调用wait()或waitpid()等待子进程结束.如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出.这样的子进程不能被调度,所做的只是在进程列表中占据