我想实现一个双向fifo。下面的代码运行正常,但它没有使用双向fifo。我已经在互联网上找遍了,但没有找到任何好的例子。
我该怎么做呢?
谢谢,
WRITER.c:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define MAXLINE 4096
#define READ 0
#define WRITE 1
int main (int argc, char** argv)
{
int a, b, fd;
do {
fd=open("/tmp/myfifo",O_WRONLY);
if (fd==-1) sleep(1);
} while (fd==-1);
while (1) {
scanf("%d", &a);
scanf("%d", &b);
write(fd,&a,sizeof(int));
write(fd,&b,sizeof(int));
if (a == 0 && b == 0)
{
break;
}
}
close(fd);
return 0;
}READER.c:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#define MAXLINE 4096
#define READ 0
#define WRITE 1
int main(void)
{
int n1, n2;
int fd;
mkfifo("/tmp/myfifo",0660);
fd=open("/tmp/myfifo",O_RDONLY);
while(read(fd, &n1, sizeof(int) ))
{
read(fd, &n2, sizeof(int));
if (n1 == 0 && n2 == 0)
{
break;
}
printf("soma: %d\n",n1+n2);
printf("diferenca: %d\n", n1-n2);
printf("divisao: %f\n", n1/(double)n2);
printf("multiplicacao: %d\n", n1*n2);
}
close(fd);
return 0;
}发布于 2010-04-27 23:21:20
FIFO往往是一种方式。如果你想要一个既能读又能写的FIFO,那么你真正想要的可能是一对FIFO(每个方向一个)或一个UNIX套接字。
发布于 2010-04-27 23:46:52
FIFO(也称为命名管道)提供了一个单向进程间通信通道。FIFO具有读取端和写入端。写入FIFO的写入端的数据可以从FIFO的读取端读取。因为它们是单向的,所以双向通信需要一对FIFO。
作为cHao suggested,另一种选择是使用Unix套接字。与FIFO相比,Unix域套接字需要更多的设置开销(套接字创建、初始化和连接),但更灵活,并提供双向通信。
发布于 2010-04-28 01:54:19
另一种选择是使用psudo-terminal (ptty)。您还可以使用TCP套接字,它比UNIX套接字具有更高的开销,但也可以工作。
由于死锁的可能性,双向管道通常是不被鼓励的(prog1正在等待来自prog2的数据,而prog1正在等待来自prog2的数据...),但这也可能发生在任何一种变通方法中,并且可能发生在常用的协议中,比如SMTP (简单邮件传输协议),因为每一方都在会话中扮演着一个角色。
如果您认为可能发生死锁,您可能希望至少有一方具有超时,这可以通过一个轮询函数(包括poll、select、pselect和epoll_*)或通过安排发送SIGALM (带有警报或其他一些允许更短时间和更多控制的函数)来实现,这样您的程序就可以被踢出死锁。
https://stackoverflow.com/questions/2722293
复制相似问题