1. 程式人生 > >程序通訊--命名管道(FIFO)

程序通訊--命名管道(FIFO)

一.命名管道(FIFO)

    FIFO不同於管道之處在於它提供一 個路徑名與之關聯,以FIFO的檔案形式儲存於檔案系統中。命名管道是一個裝置檔案,因 此,即使程序與建立FIFO的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過FIFO 相互通訊。值得注意的是,FIFO(first input first output)總是按照先進先出的原則工作,第一 個被寫入的資料將首先從管道中讀出。 

二.命名管道的建立

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

  int mknod(const char *path,mode_t mod,dev_t dev); 

    函式mknod引數中path為建立的命名管道的全路徑名:mod為建立的命名管道的模式,指明其存取許可權;dev為裝置值,該值取決於檔案建立的種類,它只在建立裝置檔案時才會用到。這兩個函式呼叫成功都返回0,失敗都返回-1。

三.測試用例

 1.標頭檔案

#pragma once

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

#define _FIFO_NAME_ "./my_fifo"
#define _SIZE_ 1024

  2:server端
#include"comm.h"

int main()
{
	if(mkfifo(_FIFO_NAME_,S_IFIFO | 0666) < 0)
	{
		printf("errno:%d,strerror:%s\n",errno,strerror(errno));
	}

	int fd = open(_FIFO_NAME_,O_RDONLY);
	if(fd < 0)
	{
		printf("%s\n",strerror(errno));
		return 2;
	}

	char buf[_SIZE_];
	while(1)
	{
		memset(buf,'\0',sizeof(buf));
		read(fd,buf,sizeof(buf) - 1);
		printf("client# %s\n",buf);
	}

	close(fd);
	return 0;
}
  3.client端

#include"comm.h"

int main()
{
	int fd = open(_FIFO_NAME_,O_WRONLY);
	if(fd < 0)
	{
		printf("%s\n",strerror(errno));
	}

	char buf[_SIZE_];
	while(1)
	{
		printf("Please enter# :");
		memset(buf,'\0',sizeof(buf));
		ssize_t _s = read(1, buf, sizeof(buf) - 1);
		if(_s > 0)
		{
			buf[_s - 1] = '\0';
		}

		write(fd,buf,strlen(buf));
	}
	return 0;
}
四.測試結果



        以上就是本人在學習過程中的一些經驗總結。當然,本人能力有限,難免會有紕漏,希望大家可以指正。