命名管道和后台进程

时间:2014-05-06 23:04:11

标签: c operating-system background-process named-pipes

我正在尝试创建一个名为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);
}

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

1 个答案:

答案 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);