命名管道的函数:
int mkfifo(const char * pathname,mode_t mode);
pipe,popen,open,umask
客户端创建管道,等待服务端的消息。
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO "/home/XXX/myfifo" //¹ܵÀ»Ö
main(int argc,char** argv)
{
char buf_r[100];
int fd;
int nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)) //´´½¨²¢ִÐ
printf("cannot create fifoserver\n");
printf("Preparing for reading bytes...\n");
memset(buf_r,0,sizeof(buf_r));
fd=open(FIFO,O_RDONLY,0); //readonly ²»×È
if(fd==-1)
{
perror("open");
exit(1);
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){ //¶Á¡¹ܵÀ
if(errno==EAGAIN)
printf("no data yet\n");
}
printf("read %s from FIFO\n",buf_r);
sleep(1);
}
pause();
unlink(FIFO);
}
服务端向管道写消息。
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO_SERVER "/home/XXX/myfifo"
void main(int argc,char** argv) //argc:²Îý¿ argv£º²Îýnt fd;
{
int fd;
char w_buf[100];
int nwrite;
if(fd==-1)
if(errno==ENXIO)
printf("open error; no reading process\n");
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0); //writeonly
if(argc==1)
printf("Please send something\n");
while (1) {
scanf("%s", w_buf);
if((nwrite=write(fd,w_buf,100))==-1) //write
{
if(errno==EAGAIN)
printf("The FIFO has not been read yet.Please try later\n");
}
else {
printf("write %s to the FIFO\n",w_buf);
}
}
}
在执行的时候,可能会出现权限问题,不需要root用户权限,只需给管道赋予权限即可。