gpt4 book ai didi

c - 命名管道和后台进程

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:34 25 4
gpt4 key购买 nike

我正在尝试创建一个名为服务器的后台进程,它使用命名管道从“客户端”程序接收数据,并且该进程将该数据保存在名为 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);
}

但是,这似乎行不通。日志文件中没有任何操作,我认为服务器文件中的读取调用尚未完成。有什么建议吗?

最佳答案

问题出在你这里:

while(fd2 = open(fifo, O_RDONLY)>=0){

由于 C 运算符的优先级,这实际上被评估为:

while((fd2 = (open(fifo, O_RDONLY)>=0)) != 0){

即调用 open(),检查它的返回值是否大于 0,然后将该 bool 结果赋给 fd2,然后检查它是否为零。

这样你就可以从文件号读取。 1,这是标准输出,肯定会无限期阻塞。

将其更改为此,当然一切都会开始工作:

while((fd2 = open(fifo, O_RDONLY)) >=0){

此外,您在没有任何权限的情况下打开日志文件,您应该指定一些以便以后可以以某种方式访问​​它,例如:

fd_log=open("/home/me/log.txt",O_WRONLY | O_CREAT | O_APPEND, 0600);

关于c - 命名管道和后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23505978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com