学习笔记第二十八天

有名管道(FIFO)

有名管道是Linux系统中一种特殊的文件类型,它允许不相关的进程之间进行通信。有名管道在文件系统中具有具体的路径和名称,因此可以被多个进程共同访问。

特点
  • 持久性:有名管道在文件系统中以文件的形式存在,直到被显式删除。
  • 多进程访问:多个进程可以同时访问同一个有名管道。
  • 半双工通信:数据只能单向流动,但可以通过两个有名管道实现双向通信。
  • 阻塞与非阻塞:进程可以在读写操作时选择阻塞或非阻塞模式。
  • 类似文件操作:进程可以使用open()read()write(), 和close()等函数对有名管道进行操作。
创建和使用函数
  • mkfifo():用于创建一个有名管道,需要指定管道的路径和访问权限。
  • open():用于打开一个文件或管道,并返回一个文件描述符,以便后续操作。
  • write():用于将数据写入文件描述符对应的文件或管道。
  • read():用于从文件描述符对应的文件或管道中读取数据。
实现代码示例

写入数据的进程(Writer)


	#include <stdio.h> 
	#include <stdlib.h> 
	#include <unistd.h> 
	#include <fcntl.h> 
	#include <sys/types.h> 
	#include <sys/stat.h> 
	#include <string.h> 
	#define FIFO_PATH "./my_named_pipe" 
	
    int main(void) 
    { 
	    int fd; 
	    char *message = "Hello from writer!"; 
	    fd = open(FIFO_PATH, O_WRONLY); 
	if (fd == -1) 
    { 
	    perror("open"); 
	    return -1; 
	} 
	    write(fd, message, strlen(message)); 
	    close(fd); 
	    return 0; 
	}


读取数据的进程(Reader)

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <string.h> 
#define FIFO_PATH "./my_named_pipe" 
int main(void) 
{ 
    int fd; 
    char buffer[50]; 
    mkfifo(FIFO_PATH, 0666); 
    fd = open(FIFO_PATH, O_RDONLY); 
    if (fd == -1) { 
    perror("open"); 
    return -1; 
} 
    read(fd, buffer, sizeof(buffer)); 
    printf("收到消息:%s\n", buffer); 
    close(fd); 
    return 0; 
}


信号

信号是Linux系统中一种进程间通信机制,用于通知进程某些事件的发生。

特点
  • 可以由硬件异常、软件错误、用户操作或其他原因产生。
  • 每个信号都有一个预定义的行为,如终止进程、产生核心转储或暂停进程等。
  • 进程可以通过安装信号处理函数来改变这些默认动作,或者完全忽略特定的信号。
signal函数

signal函数用于设置或获取进程中特定信号的处理函数。

  • 原型:void (*signal(int signum, void (*handler)(int)))(int);
  • signum:要设置处理函数的信号编号。
  • handler:指向信号处理函数的指针。
  • 返回值:前一个信号处理函数的地址,或在设置新的处理函数时返回SIG_ERR
信号处理函数的编写

信号处理函数是一个简单的C函数,其原型通常是:

void signal_handler(int signum) { 
// 处理信号的代码 
}

示例
#include <stdio.h> 
#include <signal.h> 


void signal_handler(int signum) 
{ 
    if (signum == SIGINT) 
    { 
        printf("接收到 Ctrl+C 信号\n"); 
        // 添加清理代码或其他处理逻辑 
    } 
} 

int main(void)
{ 
    signal(SIGINT, signal_handler); 
    // 主程序的其余部分... 
    return 0; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值