linux命名管道编程问题
程序是想用命名管道FIFO实现简单的聊天功能.下面设是李四端的源代码#include<stdio.h>#include<fcntl.h>#include<memory.h...
程序是想用命名管道FIFO实现简单的聊天功能.下面设是李四端的源代码
#include <stdio.h>
#include <fcntl.h>
#include <memory.h>
#include <string.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main()
{
int i,rfd,wfd,len=0,fd_in;
char str[32];
int flag,stdinflag;
fd_set write_fd,read_fd;
struct timeval net_timer;
mkfifo("fifo1",S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH);
mkfifo("fifo2",S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH);
wfd=open("fifo1",O_WRONLY);
rfd=open("fifo2",O_RDONLY);
if(rfd <0||wfd <0) return 0;
printf("这是李四端!");
while(1){
FD_ZERO(&read_fd);
FD_SET(rfd,&read_fd);
FD_SET(fileno(stdin),&read_fd);
net_timer.tv_sec=5;
net_timer.tv_usec=0;
memset(str,0,sizeof(str));
if(i=select(rfd+1,&read_fd,NULL,NULL,&net_timer) <=0)
continue;
if(FD_ISSET(rfd,&read_fd)){
read(rfd,str,sizeof(str));
printf("------------------------\n");
printf("zhang:%s\n",str);
}
if(FD_ISSET(fileno(stdin),&read_fd)){
printf("------------------------\n");
fgets(str,sizeof(str),stdin);
len=write(wfd,str,strlen(str));
}
}
close(rfd);
close(wfd);
}
问题:原本想是程序运行后先输出"这是李四端!" 再写管道或查询管道看有没其它(设张三端)程序写管道 ,有写就读出,进而实现聊天功能.但是上机执行发现,在终端运行后连"这是李四端!"都没输出,调试发现程序执行到wfd=open("fifo1",O_WRONLY);
就不能再单步执行了.
不知道和权限有关,试了下用root执行也没用.
为什么?程序是书上的,不会错的吧? 展开
#include <stdio.h>
#include <fcntl.h>
#include <memory.h>
#include <string.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main()
{
int i,rfd,wfd,len=0,fd_in;
char str[32];
int flag,stdinflag;
fd_set write_fd,read_fd;
struct timeval net_timer;
mkfifo("fifo1",S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH);
mkfifo("fifo2",S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH);
wfd=open("fifo1",O_WRONLY);
rfd=open("fifo2",O_RDONLY);
if(rfd <0||wfd <0) return 0;
printf("这是李四端!");
while(1){
FD_ZERO(&read_fd);
FD_SET(rfd,&read_fd);
FD_SET(fileno(stdin),&read_fd);
net_timer.tv_sec=5;
net_timer.tv_usec=0;
memset(str,0,sizeof(str));
if(i=select(rfd+1,&read_fd,NULL,NULL,&net_timer) <=0)
continue;
if(FD_ISSET(rfd,&read_fd)){
read(rfd,str,sizeof(str));
printf("------------------------\n");
printf("zhang:%s\n",str);
}
if(FD_ISSET(fileno(stdin),&read_fd)){
printf("------------------------\n");
fgets(str,sizeof(str),stdin);
len=write(wfd,str,strlen(str));
}
}
close(rfd);
close(wfd);
}
问题:原本想是程序运行后先输出"这是李四端!" 再写管道或查询管道看有没其它(设张三端)程序写管道 ,有写就读出,进而实现聊天功能.但是上机执行发现,在终端运行后连"这是李四端!"都没输出,调试发现程序执行到wfd=open("fifo1",O_WRONLY);
就不能再单步执行了.
不知道和权限有关,试了下用root执行也没用.
为什么?程序是书上的,不会错的吧? 展开
展开全部
Once you have created a FIFO special file in this way, any process can open it for reading or writing, in the same way as an ordinary
file. However, it has to be open at both ends simultaneously before you can proceed to do any input or output operations on it.
Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa. See fifo(7) for
non-blocking handling of FIFO special files.
这个是 man 3 mkfifo里面有关fifo的描述。
你要用写方式或读方式打开FIFO,必须有另外一端有相对的方式打开才能能够继续。
file. However, it has to be open at both ends simultaneously before you can proceed to do any input or output operations on it.
Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa. See fifo(7) for
non-blocking handling of FIFO special files.
这个是 man 3 mkfifo里面有关fifo的描述。
你要用写方式或读方式打开FIFO,必须有另外一端有相对的方式打开才能能够继续。
力控科技
2024-08-19 广告
2024-08-19 广告
ForceSCADA是力控科技信创产品的重要组成部分,具备完全自主知识产权,支持部署在Linux桌面版、服务器版、嵌入式等系统架构下。使用ForceSCADA可以搭建创新性高、扩展性佳、融合度强的SCADA平台,进而构建高效、智能化的监控中...
点击进入详情页
本回答由力控科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询