/**
*  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;
}