有名管道,信号通信

有名管道===》fifo ==》有文件名称的管道。
                      文件系统中可见

框架:
    (1).创建有名管道 -- 类似 文件 (管道文件) 
    (2).打开有名管道 -- open 
    (3).读写管道     -- read/write 
    (4).关闭管道  ==》卸载有名管道 //close 

1、创建:mkfifo //创建了一个有名管道
#include <sys/types.h>
#include <sys/stat.h>
 remove();

int mkfifo(const char *pathname, mode_t mode);
功能:
      在指定的pathname路径+名称下创建一个权限为
      mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
      mode  8进制文件权限。
返回值:成功 0
        失败  -1;

2、打开有名管道 open
    注意:该函数使用的时候要注意打开方式,
    因为管道是半双工模式,所有打开方式直接决定
    当前进程的读写方式。
    一般只有如下方式:
    int fd-read = open("./fifo",O_RDONLY); ==>fd 是固定读端
    int fd-write = open("./fifo",O_WRONLY); ==>fd 是固定写端
    不能是 O_RDWR 方式打开文件。
    不能有 O_CREAT 选项,因为创建管道有指定的mkfifo函数
    
    
    双工     ---发送和接收可以同时进行 --手机,电话
    半双工   ---发送端 和 接收端  同一个时刻之后有一个起效 ---对讲机 
    单工     ---发送端 接收端固定 --- 广播 
    
    
    有名管道打开:
    注意,
    如果一端是以只读,或者只写方式打开的。
    程序会阻塞,
    阻塞在打开操作。
    直到另一端,以只写或只读方式打开。
    
    A.c --- 只读 
    B.c --- 只写 
    
    
    
    

3、管道的读写: 文件IO

    读: read(fd-read,buff,sizeof(buff));
    写: write(fd-write,buff,sizeof(buff));

4、关闭管道:
        close(fd);

5、卸载管道:remove();
        int unlink(const char *pathname);
        功能:将指定的pathname管道文件卸载,同时
              从文件系统中删除。
        参数: ptahtname 要卸载的有名管道 
        返回值:成功 0
                失败  -1;

    kill      -xx     xxxx
    发送进程  信号    接收进程
    kill -9 1000
    a.out  9 1000
    
    1、发送端
    #include <sys/types.h>
    #include <signal.h>

    int   kill(pid_t pid, int sig);
    功能:通过该函数可以给pid进程发送信号为sig的系统信号。
    参数:pid 要接收信号的进程pid
          sig 当前程序要发送的信号编号 《=== kill  -l
    返回值:成功 0
            失败  -1;

进程间通信 ===》信号通信
    应用:异步通信。 中断   (软件中断)
    1~64;32应用编程。

    
    
    软中断 
    
    

  进程
   |
   |     中断源 
   |    /--->响应(信号)中断
   |   /           |
   |  /            |        | - 1. 默认操作 
   V /            信号处理  | - 2. 忽略操作
   o               |        | - 3. 用户自定义的处理  
   | \             |
   |  \            |
   |   \           |
   |    \----------|
   |
   V

int pause(void);
    功能:
         进程暂停,不再继续执行,除非
          收到其他信号。


    2、信号  kill  -l  ==>前32个有具体含义的信号
        
        信号的含义详见图片


    3、接收端
        每个进程都会对信号作出默认响应,但不是唯一响应。
        一般如下三种处理方式:
        1、默认处理
        2、忽略处理 9,19
        3、自定义处理 9,19 捕获

        以上三种方式的处理需要在如下函数上实现。

    信号注册函数原型:
     
     void ( *signal(int signum, void (*handler)(int)) ) (int);
       
       
       typedef void (*sighandler_t)(int);

       void (*)(int) signal(int signum, void (*)(int)  handler);

      //void (*signal(int signum, void (*handler)(int)  ))(int) ;


     typedef void (*sighandler_t)(int);
     ===》void (*xx)(int); == void fun(int);
     ===》xx是 void fun(int) 类型函数的函数指针
     ===》typedef void(*xx)(int)   sighandler_t; ///错误
          typedef int   myint;
     
     
     sighandler_t signal(int signum, sighandler_t handler);
     
     
     ===> signal(int sig, sighandler_t fun);
     ===> signal(int sig, xxx fun);
     ===>fun 有三个宏表示:SIG_DFL 表示默认处理
                           SIG_IGN 表示忽略处理
                           fun     表示自定义处理


 

                

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值