FIFO读写产生SIGPIPE信号

本文通过一个实例介绍了在FIFO(命名管道)操作中如何触发SIGPIPE信号。当尝试向已关闭的管道写入数据时,进程会收到SIGPIPE信号,导致'Broken pipe'错误。这种情况通常发生在CentOS 6.3环境下使用GCC编译的程序中。后续内容会深入探讨相关细节。
摘要由CSDN通过智能技术生成

以前一直在听说产生SIGPIPE信号,我但我平时遇得少,没怎么管它,今天一小心就遇到

先看代码吧

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#define FIFO_FN   "/tmp/test"

void catch_pipe(int n) {
	printf("signo:%d\n", n);
}

int main() {
	signal(SIGPIPE, catch_pipe);
	if ((mkfifo(FIFO_FN, S_IRWXU | S_IRGRP | S_IROTH) < 0)
			&& (errno != EEXIST)) {
		perror("mkfifo:");
	}
	int fo = fork();
	if (fo > 0) {
		int fd = open(FIFO_FN, O_WRONLY);
		if (fd == -1) {
			perror("open pipe");
		}
		int flg = fcntl(fd, F_GETFL);
		if (flg < 0) {
			perror("fcntl:");
		}
		flg |= O_NONBLOCK;
		fcntl(fd, F_SETFL, flg);
		int wr;
		char buf[1024];
		printf("writing...\n");
		sleep(1);
		if ((wr = write(fd, buf, 1
异步FIFO(First-In-First-Out)读空信号产生的主要目的是在两个不同频率的时钟域之间实现FIFO队列的数据同步。在异步FIFO设计中,读空信号是用来指示FIFO是否为空,即没有数据可供读取。产生读空信号的关键在于正确地判断FIFO的头部指针与尾部指针的位置关系,以及这些指针在不同时钟域之间的同步。 具体实现时,通常会使用以下几个步骤: 1. 读写指针的同步:由于FIFO位于两个不同的时钟域,所以需要通过一些同步机制(如双或三触发器同步)来确保指针信息在传递过程中不会受到亚稳态的影响。 2. 空状态的判断:当读指针追上写指针时,意味着FIFO为空。但由于指针同步可能会引入延迟,设计时需要考虑这些延迟,以避免在FIFO非空时错误地产生信号。 3. 利用灰色码计数:为了减少亚稳态的风险,通常将读写指针设计为灰色码(Gray Code)计数器。这样每次只有一个位发生变化,降低了同步时出现错误的可能性。 产生读空信号的逻辑大致可以这样实现: - 设计两个指针:读指针(Read Pointer)和写指针(Write Pointer),分别用于指示FIFO读写位置。 - 将读写指针在各自的时钟域内同步到对方的时钟域。 - 比较两个同步后的指针值来确定是否相等。如果相等,则认为FIFO为空。 - 为了防止同步过程中产生的延迟导致误判,可能还需要额外的逻辑来确定FIFO确实为空,而不是因为同步延迟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值