您的位置:首页 > 其它

简单的实现在有名管道里,进程间的通信(非阻塞)。

2016-11-22 10:16 429 查看
/*fifo_write.c*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <memory.h>
#include <stdlib.h>
#include <unistd.h>

#define FIFO_SEVER "/tmp/fifosever"

int main(int argc,char *argv[])
{
int fd;
char w_buf[4096*2];
int real_wnum;

memset(w_buf,0,4096*2);

if((mkfifo(FIFO_SEVER,O_CREAT|O_EXCL) < 0) && (errno != EEXIST))
{
printf("cannt create fifosever!\n");
exit(0);
}
fd = open(FIFO_SEVER,O_WRONLY|O_NONBLOCK);
if(fd == -1)
{
if(errno == ENXIO)
printf("open error,no reading process\n");
}
scanf("%s",w_buf);
real_wnum = write(fd,w_buf,2048);
if(real_wnum == -1)
{
if(errno == EAGAIN)
{
printf("write to fifo error try later!\n");
}
}
else
{
printf("real write num is %d\n",real_wnum);
}

return 0;
}
/*fifo_read.c*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <memory.h>

#define FIFO_SEVER "/tmp/fifosever"

int main(int argc,char **argv)
{
char r_buf[4096*2];
int fd;
int r_size;
int ret_size;

r_size = atoi(argv[1]);

printf("requore real read bytes %d\n",r_size);

memset(r_buf,0,sizeof(r_buf));
fd = open (FIFO_SEVER,O_RDONLY|O_NONBLOCK);

if(fd == -1)
{
printf("open %s for read error!\n");
exit(0);
}
while(1)
{
memset(r_buf,0,sizeof(r_buf));
ret_size = read(fd,r_buf,r_size);
if(ret_size == -1)
{
if(errno == EAGAIN)
printf("no data avalible\n");
}
printf("real read bytes %d\n",ret_size);
sleep(1);
}
pause();
unlink(FIFO_SEVER);

return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: