Linux系统编程(12)信号 和 有名管道

一、有名管道

有名管道(Named Pipe)是一种进程间通信(IPC)机制,允许不同进程之间以一种特定的方式进行数据传输。与匿名管道不同,有名管道在创建时会被赋予一个名称,这使得不同的进程能够通过这个名称来访问管道。

二、有名管道的特点

  1. 定义: 有名管道是一个特殊的文件类型,它在文件系统中有一个名称,允许不同进程之间进行通信。

  2. 特性:

    • 可以用于任意进程间的通信,不限于父子进程。
    • 数据传输遵循先进先出(FIFO)的读写规则。
  3. 读写规则:

    • 写入到管道中的数据会被按顺序读取。
    • 如果没有进程读取数据,写入进程可能会被阻塞,反之亦然。
  4. 不支持定位操作:

    • 管道中的数据不支持定位操作,例如lseekfseek,这意味着不能在管道中随机访问数据。
  5. 特殊文件:

    • 有名管道作为一种特殊文件,具有系统级的命名,可以在文件系统中查找到,并且符合前面的管道操作特点。

三、有名管道的相关函数

mkfifo: 创建一个有名管道。

int mkfifo(const char *pathname, mode_t mode);

由于管道是一种特殊的文件,因此实际上对管道的操作就是对文件的操作

open、write等都可以使用。除了定位操作。

四、信号

信号是 用于进程间通信的一种机制,它允许进程相互通知事件的发生。信号通常用于告知进程某些异步事件,例如用户中断、定时器到期或其他进程的事件。

1. 信号的基本概念

  • 信号的定义: 信号是一种软件中断,用于通知进程发生了某种事件。信号可以来自用户、内核或其他进程。
  • 异步通信: 信号提供了一种异步的方式来处理事件,进程不需要一直轮询某个状态,而是通过接收信号来响应事件。

2. 信号的种类

  • 常见信号:
    • SIGINT:由 Ctrl+C 产生,用于中断进程。
    • SIGKILL:强制终止进程,无法被捕捉或忽略。
    • SIGTERM:请求终止进程,进程可以捕捉此信号进行清理操作。
    • SIGSEGV:非法访问内存,导致进程中止。
    • SIGALRM:定时器到期

3. 信号的处理

  • 默认操作: 每个信号都有一个默认的操作,如终止进程或忽略信号。

                SIG_IGN(忽略信号) SIG_DFL(默认操作)

  • 自定义信号处理: 进程可以注册一个信号处理函数,以便在接收到某个信号时执行特定操作。可以使用 signal 函数或 sigaction 函数来设置信号处理器。

  • #include <signal.h>  
    
    void signal_handler(int signum) {  
        printf("Received signal %d\n", signum);  
    }  
    
    int main() {  
        signal(SIGINT, signal_handler); // 注册信号处理器  
        while (1) {  
            // 进行某些操作  
        }  
        return 0;  
    }

    4. 信号的发送和接收

  • 发送信号: 可以使用 kill 命令或 kill 函数(在程序中)向进程发送信号。

  • kill(pid, SIGTERM); // 向指定进程发送 SIGTERM 信号
  • 进程组和会话: 信号可以向一个进程组或整个会话发送,进而影响多个进程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值