day30_信号

2013年11月12日 星期二 09时53分40秒

Today:
  信号 -  非负整数,信号0是什么?
    信号0 没有特定的用途,主要用来测试是否有发送信号的权限
  IPC(进程间通信)- 管道
  信号的发送方式:
    1.键盘发送(部分信号)
      Ctrl+C -> 发送信号2
      Ctrl+\ -> 发送信号3
      Ctrl+Z -> 发送信号20
    2.出错(部分信号)
      段错误 -> 信号11 SIGSEGV
      总线错误 -> 信号7 SIGBUS
      整数除以0 -> 信号8 SIGFPE
    3.kill 命令 发送(所有信号)
      格式: kill -信号 进程PID
    4.函数发送信号(部分/所有信号)
      kill() - 发送任意信号给任意进程
      raise() - 发送任意信号给本进程
      alarm() - 闹钟函数,通过产生闹钟信号工作
      sigqueue() - 发送信号的同时还能附加数据
      ...
    sleep()函数被没有忽略的信号打断,此时返回睡眠的剩余秒数
    usleep()函数能设置更小的休眠时间,到微秒。usleep()和信号无关
    kill() 是发送信号的主体函数,格式:
      int kill(pit_t pid,int signo);
       参数pid取值的效果和waitpid()效果一样,常见的有:
       正数 - 对应PID的进程
       -1   - 所有进程(要求有权限)   
    alarm() - 闹钟函数,一段时间之后产生闹钟信号
    信号集 - 信号的集合,多个信号放入信号集
      sigset_t -> 一个超大的整数
      关于集合的函数:
        增加信号    - sigaddset()
        删除信号    - sigdelset()
        查询信号    - sigismember()
        清空信号集  - sigemptyset()
        填满信号集  - sigfillset()
      有信号就是对应二进制位 置1
      无信号就是对应二进制位 置0
      位与 用来置0,位或 用来置1,位异或 用来取反
      
  信号屏蔽 - 执行关键代码时,不希望代码被信号打断,可以使用信号屏幕防止信号打断程序,信号屏蔽不是没有信号到来,而是信号来了暂时不处理,等解除了屏蔽后再处理。
  信号屏蔽和信号集结合使用,函数:sigprocmask()用于信号屏蔽
  int sigprocmask(int how,sigset_t* new,sigset_t* old)
   参数:
       how有三个值:
         SIG_BLOCK: 相当于加法 原有的 + new的
          A B C + C D E -> A B C D E
         SIG_UNBLOCK: 相当于减法 原有的 - new的
          A B C - C D E -> A B
         SIG_SETMASK: 相当于赋值 直接等于new的
          A B C   C D E -> C D E(最常用)
          
       new是需要屏蔽的信号(传入的参数)
       old是以前屏蔽的信号(传出的参数),如果以前屏蔽的信号不需要保留,给NULL即可
       
  sigaction() 是增强版的signal(),是signal()的底层实现。
  sigaction() 有三个参数,第一个是信号参数,第二个参数指针:
  struct sigaction
  {
     函数指针1 sa_handler;
     函数指针2 sa_sigaction;
      sigset_t sa_mask;
      int sa_flags;
      第五个成员忽略;
  }
     sa_handler 和 sa_sigaction 选其一做信号处理函数,默认情况下使用sa_handler,当sa_flags包含SA_SIGINFO时就是用sa_sigaction做处理函数。  
 
   每个信号在执行自己的处理函数期间,都先天屏蔽自身的到来,sa_mask 可以在执行信号处理函数期间,屏蔽其他信号。信号处理函数期间,屏蔽其他信号。信号处理函数执行完毕,屏蔽将被解除
   
   IPC - 进程间通信,就是进程之间的数据交互
    常见的IPC方式:
     1.文件
     2.信号
     3.管道
     4.共享内存
     5.消息队列
     6.信号量集(semaphore arrays)
     7.网络通信(socket)
     ......
     其中,共享内存,消息队列和信号量集 遵守相同的规范,统称为 XSI IPC。编码上有很多共同点
     
     IPC之管道 - 最古老的IPC方式,现在使用频率极低。管道分为有名管道和无名管道。管道的媒介是一种特殊的文件 - 管道文件
     touch命令和open函数都无法创建管道文件,mkfifo命令和mkfifo函数可以创建管道文件。数据交互用读写文件的方式实现.管道文件后缀名 .pipe
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值