有名管道第一次读取管道阻塞,写入一次数据之后,不再阻塞解决办法

环境:ubuntu 14.04 gcc

写入管道端:

fifo_send.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

typedef struct _msgcontent{
	char szAction[512];   
	char szDevice[512];   
	char mountPath[512];  
}UMSGCONTENT;

int main (int argc, char *argv[])
{
	int fd;
	UMSGCONTENT umsg;
	strcpy ((char *)&umsg.szAction, "add");
	strcpy ((char *)&umsg.szDevice, "/dev/sda1");
	strcpy ((char *)&umsg.mountPath, "/mnt");

	mkfifo ("/tmp/.mountFifo", 0777);
	fd = open ("/tmp/.mountFifo", O_WRONLY);

	write (fd, &umsg, sizeof (umsg));

	close (fd);

	return 0;
}

读取管道fifo_receive.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

typedef struct _msgcontent{
	char szAction[512];   
	char szDevice[512];   
	char mountPath[512];  
}UMSGCONTENT;

int main (int argc, char *argv[])
{
	int fd;
	UMSGCONTENT umsg;

	fd = open ("/tmp/.mountFifo", O_RDWR); 
	if (fd < 0) {
		printf ("open failed\n");
		return -1;
	}
	
	printf ("open succes\n");
	
	while (1) {
		int res = read (fd, &umsg, sizeof (umsg));
		
		printf ("szAction  [%s] \n", umsg.szAction);
		printf ("szDevice  [%s] \n", umsg.szDevice);
		printf ("mountPath [%s] \n", umsg.mountPath);
	}
	close (fd);

	return 0;
}

编译,运行:

gcc fifo_send.c -o fifo_send

gcc fifo_receive.c -o fifo_receive
第一步:运行fifo_send
$ ./fifo_send

第二步:运行fifo_receive
$ ./fifo_receive
szAction  [add] 
szDevice  [/dev/sda1] 
mountPath [/mnt]

这样就可以实现,管道的每次读写数据时,如果数据为空则都是阻塞状态

注意: 在接收管道数据的时候(fifo_receive.c) 

open 函数打开时,如果使用O_RDONLY标志打开,只能实现管道第一次读取时阻塞,之后不会再出现阻塞状态。



猜你喜欢

转载自blog.csdn.net/hpu11/article/details/80176438