我正在尝试创建一个名为server的后台进程,它使用命名管道从“客户端”程序接收数据,然后该进程将该数据保存在名为log的文件中。我的代码如下:
服务器:
main(){
int fd2,fd_log;
char *fifo ="/home/me/fifo";
char c;
mkfifo(fifo, 0666);
int x;
while(fd2 = open(fifo, O_RDONLY)>=0){
fd_log=open("/home/me/log.txt",O_WRONLY | O_CREAT | O_APPEND);
while(read(fd2,&c,1)>=0){
write(fd_log,&c,1);
}
close(fd2);
close(fd_log);
}
}
客户端:
main(){
int fd1;
char *fifo ="/home/me/fifo";
char c;
fd1 = open(fifo, O_WRONLY);
while(read(0, &c, 1)>=0){
write(fd1,&c,1);
}
close(fd1);
}
但是,这似乎不起作用。日志文件中没有任何操作,我认为服务器文件中的读取调用没有完成。有什么建议吗?
答案 0 :(得分:3)
问题在于你的意思:
while(fd2 = open(fifo, O_RDONLY)>=0){
由于C运算符优先级,这实际上被评估为:
while((fd2 = (open(fifo, O_RDONLY)>=0)) != 0){
即。调用open()
,检查它的返回值是否大于0,然后将该布尔结果赋给fd2
,然后检查它是否为零。
那样你就可以从文件号读取。 1,这是stdout,肯定会无限期地阻止。
将其更改为此,当然一切都开始工作:
while((fd2 = open(fifo, O_RDONLY)) >=0){
此外,您正在打开没有任何权限的日志文件,您应该指定一些,以便以后可以以某种方式访问它,例如:
fd_log=open("/home/me/log.txt",O_WRONLY | O_CREAT | O_APPEND, 0600);