命名管道和后台进程

帕勃罗德

我正在尝试创建一个名为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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

后台进程管道输入

来自分类Dev

如何杀死管道后台进程?

来自分类Dev

如何杀死管道后台进程?

来自分类Dev

Android和后台进程

来自分类Dev

PHP和后台进程

来自分类Dev

命名和未命名管道

来自分类Dev

Stata和命名管道

来自分类Dev

命名管道和“ GetNamedPipeHandleState”

来自分类Dev

多个进程可以打开命名管道吗?

来自分类Dev

Python子进程因命名管道而挂起

来自分类Dev

Python子进程因命名管道而挂起

来自分类Dev

使用命名管道模拟进程替换

来自分类Dev

rxjava后台进程和中间更新ui

来自分类Dev

iOS:后台进程和单例

来自分类Dev

为什么`jobs`和`dirs`在命令替换,进程替换,管道和后台作业中运行的结果与原始Shell中的输出相同?

来自分类Dev

后台进程和守护进程之间的区别

来自分类Dev

如何枚举进程中所有命名管道的名称?

来自分类Dev

编写器进程退出后,如何从命名管道读取?

来自分类Dev

python multiprocessing动态创建的进程和管道

来自分类Dev

Windows上的命名管道和OVERLAPPED

来自分类Dev

命名管道和fortran出现问题

来自分类Dev

C从命名管道读取和写入

来自分类Dev

从命名管道和管道读取到辅助过程

来自分类Dev

.bat文件以在Windows中运行和停止后台进程

来自分类Dev

如何将进程发送到后台和前台?

来自分类Dev

Tkinter和线程控制连续的后台进程

来自分类Dev

如何通过管道将命令传递给在后台运行的进程?

来自分类Dev

如何在后台使用后台进程和警报管理器创建通知消息?

来自分类Dev

Node.js子进程和管道-OSX与Ubuntu