我正在尝试创建一个名为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);
}
但是,这似乎不起作用。日志文件中没有任何操作,我认为服务器文件中的read调用尚未完成。有什么建议?
问题出在您的行上:
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句