• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
zuoanddie
博客园    首页    新随笔    联系   管理    订阅  订阅

Linux—信号(day09)

目录

一、使用C程序访问环境变量

二、文件输入重定向

三、管道

四、信号


 

 

四、信号

  信号就是软件模拟的中断,信号是进程的异步通讯机制。

  如何查看系统提供的信号:kill -l,下面的数字为信号的编号,编号后面的字符为信号的名称。

man 7 signal,可查看信号帮助

 通过shell向进程发送信号,kill -信号编号 pid

  总的来说,信号有以下几个过程:信号的产生,可能有信号阻塞、信号未决(信号传输这一段时间)、进程捕获信号,信号处理

  进程对信号的默认处理动作就是会终止当前进程,用户可以根据自己的需求来设置对信号的处理。主要有以下:

  SIG_DEL(缺省的,默认处理状态)、SIG_IGN(忽略信号)、用户自定义信号处理函数


信号处理:

  如需使用自定义函数,则需要向进程注册一个函数,当信号到来的时候,使用注册的信号处理函数来处理到达的信号。注册函数使用signal(2)

 

#include <signal.h>
typedef void (*sighandler)(int); sighandler signal(int signum,sighandler handler);
功能:
  为信号注册处理函数
参数:
  signum:信号的名字或编号
  handler:
    SIG_DEL:默认
    SIF_IGN:忽略
    用户自定义的信号处理函数
返回值:
  错误:SIG_ERR
  成功:返回注册前的信号处理函数 

1、默认处理情况
  直接在主函数中写一个死循环,再向进程发送信号,进程就会终止
2、忽略处理
#include<stdio.h>
#include<signal.h>
int main(void){ 
signal(
2,SIG_IGN);
while(1);

return 0;
}

3、自定义处理

#include<stdio.h>
#include<signal.h>
void doit(int n){
    printf("recv signal...\n");
    return;
}
int main(void){ 
    signal(2,SIG_IGN);
    signal(3,doit);
    while(1); 
   
    return 0; 
}

 

信号的产生:

1、硬件产生信号
 ctrl+c、ctrl+\等
2、使用linux命令
 kill -信号编号 pid
3、使用函数发送信号
kill(2)
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int sig);
功能:
  发送一个信号给一个进程或进程组
参数:
  pid:
    如果pid为正,则为指定pid进程发送信号
    如果pid为0,则为进程组的每一个进程都发送信号
    如果为-1,发送给所有与发送信号进程有相同权限的进程(init除外)
    如果pid比-1还小,那么sig就被发送给id是-pid的所有进程
  sig:
    0,不发送信号,但是仍然检测错误,可以用来检测PID或者PPID是否存在
    非0:指定信号编号
返回值:
   成功:0
   错误:-1,errno被设置 

信号接收处理程序
#include<stdio.h>
#include<signal.h>
void doit(int n){
    printf("recv signum%d\n",n);
    return;
}
int main(void){ 
    printf("pid%d\n",getpid());
    signal(2,doit);
    while(1); 
    return 0; 
}

信号发送程序

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>

int main(int argc,char *argv[]){
    //通过可执行程序名+ 信号编号+pid发送信号
    int signum=atoi(argv[1]);
    pid_t pid=atoi(argv[2]);
    kill(pid,signum);
    return 0;
}

 

raise(3)

#include<signal.h>
int raise(int sig);
功能:
  发送一个信号给调用者
参数:
  sig:要发送的信号编号
返回值:
  成功:0
  失败:非0

使用raise给自己发送信号:
#include<stdio.h>
#include<signal.h>
void doit(int n){
    printf("recv signum%d\n",n);
    return;
}
int main(void){ 
    printf("pid%d\n",getpid());
    signal(2,doit);
    while(1){
        sleep(2);
        raise(2);
    }
    return 0; 
}

alarm(2)

#include<unistd.h>

unsigned int alarm(unsigned int seconds);

功能;

  设置一个传递信号的闹钟

参数:

  seconds:设置闹钟秒数

返回值:

  保留的秒数;参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回


#include<stdio.h>
#include<unistd.h>
int main(void){
    int i;
    alarm(1)
    for(i=0;;i++){
        printf("%d\n",i);
    }  
    return 0;
}

 

 

 

posted @ 2019-06-13 20:11  zuoanddie  阅读(268)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3