我想创建一个服务器进程和一个客户端进程 - 用于可选的类分配 - 并使它们相互通信。教授告诉我们:
1)我们必须使用 O_NONBLOCK
2)我们必须创建2个FIFO,一个只读一个只写
3)我们不能使用套接字
因此,我在服务器进程中创建了 2 个 FIFO,并尝试打开它们,但 WRONLY 的打开返回“没有这样的设备或地址”。
服务器进程:
......
if( mkfifo("fifo1", PERMS) < 0 && errno != EEXIST)
{
perror("can't create FIFO (read)");
exit(EXIT_FAILURE);
}
if( mkfifo("fifo2", PERMS) < 0 && errno != EEXIST )
{
perror("can't create FIFO (write)");
exit(EXIT_FAILURE);
}
if( (readfd = open("fifo1", O_RDONLY | O_NONBLOCK)) < 0)
{
perror("console: can't open read FIFO");
exit(EXIT_FAILURE);
}
if( (writefd = open("fifo2", O_WRONLY | O_NONBLOCK)) < 0)
{
perror("coord: can't open write FIFO");
exit(EXIT_FAILURE);
}
客户端进程:
.....
if( (readfd = open("fifo2", O_RDONLY | O_NONBLOCK)) < 0)
{
perror("console: can't open read FIFO");
exit(EXIT_FAILURE);
}
if( (writefd = open("fifo1", O_WRONLY | O_NONBLOCK)) < 0)
{
perror("console: can't open write FIFO");
exit(EXIT_FAILURE);
}
while( fgets(buffer, 100, stdin) ) //char buffer[100];
{
n = strlen(buffer);
w = write(writefd, buffer, n);
memset(buffer, 0, 100);
}
我在网上找了一个解决方案,我找到了this答案,很好地解释了出了什么问题,但没有提出解决问题的方法。我再次在线查看并找到了 select(),它看起来可以提供解决方案,但我在理解它的具体工作原理时遇到了一些困难。
是否可以使用 select() 来解决这个问题?
一个直接的解决方案是以阻塞模式打开
fifo 进行写入(它将阻塞直到另一端打开进行读取),然后再使其成为非阻塞:
writefd = open(fifo_name, O_WRONLY);
fcntl(writefd, F_SETFL, O_NONBLOCK);
PS:我强烈建议不要忙等待。
我是一名优秀的程序员,十分优秀!