Linux命名管道,mkfifo创建实例
/**
* mypipeserver.c: 服务器端程序
* Author: Navins
* Program Date: 2010-7-23
* Modified Date: 2010-7-23
* 使用Linux的命名管道机制,用C语言编写的服务器端程序。
* 程序中使用mkfifo函数创建命名管道,以只读方式open命名管道,隔3s读信息。
**/
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#define FIFO_CHANNEL “/home/zhulin/coding/my_fifo” /* 宏定义,fifo路径 */
int main()
{
int fd;
char buf[80];
if(mkfifo(FIFO_CHANNEL,0777)==-1) /* 创建命名管道,返回-1表示失败 */
{
perror(“Can’t create FIFO channel”);
return 1;
}
if((fd=open(FIFO_CHANNEL,O_RDONLY))==-1) /* 以只读方式打开命名管道 */
{
perror(“Can’t open the FIFO”);
return 1;
}
while(1) /* 不断从管道中读取信息 */
{
read( fd, buf, sizeof(buf) );
printf(“Message from Client: %sn”,buf );
sleep(3); /* sleep 3s */
}
close(fd); /* 关闭管道 */
return 0;
}
/**
* mypipeclient.c: 客户端程序
* Author: Navins
* Program Date: 2010-7-23
* Modified Date: 2010-7-23
* 使用Linux的命名管道机制,用C语言编写的客户器端程序。
* 程序中使用open函数以读写方式打开命名管道,隔3s写信息。
**/
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#define FIFO_CHANNEL “/home/zhulin/coding/my_fifo” /* 宏定义,fifo路径 */
int main()
{
int fd;
char s[]=”Hello!”;
if((fd=open(FIFO_CHANNEL,O_WRONLY))==-1) /* 以读写方式打开命名管道,返回-1代表失败 */
{
perror(“Can’t open the FIFO”);
return 1;
}
while(1) /* 不断向管道中写信息 */
{
write( fd, s, sizeof(s) );
printf(“Write: %sn”,s);
sleep(3); /* sleep 3s */
}
close(fd); /* 关闭管道 */
return 0;
}
使用fork函数,在一个程序里面模拟服务端和客户端。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main(void)
{
char buf[80];
int fd;
pid_t pid;
unlink( “fifo” );
mkfifo( “fifo”, 0777 );
if( (pid=fork()) == 0 )
{
char s[] = “Hello!n”;
fd = open( “fifo”, O_WRONLY );
while(1)
{
write( fd, s, sizeof(s) );
sleep(3);
}
close( fd );
}
else if( pid > 0 )
{
fd = open( “fifo”, O_RDONLY );
while(1)
{
read( fd, buf, sizeof(buf) );
printf(“Message from Client: %sn”,buf );
sleep(3);
}
close( fd );
}
else
{
printf(“Error”);
}
return 0;
}