繁体   English   中英

C从命名管道读取和写入

[英]C read and write from named pipe

我最终想要解决这个问题,但是以编程的真正的“一步一步向前”,“两步返回”的方式,我被简化为弄清楚为什么我什至无法将字符写入命名管道,然后得到那个同样的角色回来了。 这是我拥有的一个简单的MWE脚本,遗憾的是,附带的输出是:

MWE:

#include <stdio.h>
#include <fcntl.h>
#define PIPE_PATH "testpipe"

int main( int argc, char *argv[] ) {
   int fd;
   FILE *fp;
   char c;
   int result;
   int contingency;

   //Initialize it for debugging purposes
   c = 0;
   contingency = 0;

   if ( atoi ( argv [ 1 ] ) == 1 )
   {
      printf ("Writer [%s]\n", argv[1]);

      mkfifo ( PIPE_PATH, 0666 );

      fd = open ( PIPE_PATH, O_WRONLY );
      c = getchar();
      printf ( "[%d] [%s]\n", c, &c );

      if ( ( result = write ( fd, &c, 1 ) ) == -1)
      {
         fprintf ( stderr, "error writing to pipe\n" );
         return -1;
      }

      close(fd);
   }
   else if ( atoi ( argv [ 1 ] ) == 2 )
   {
      printf ( "Reader [%s]\n", argv[1] );

      fp = fopen( PIPE_PATH, "r" );
      while ( contingency < 3 && ( c = getc ( fp ) ) != EOF )
      { //contingency set to 3 to avoid infinite loop
         c = getc ( fp );
         putchar ( c );
         printf ( "[%d]\n", c ); //don't print c as a string or the shell will go nuts

         printf ( "\n" );
         contingency++;
      }
      fclose ( fp );

      unlink( PIPE_PATH );
   }

   return 0;
}

输出:

Writer [1]
q
[113] [q]
....
Reader [2]
�[255]
�[255]
�[255]

由于某种原因,我将问题符号卡在了六角形中,但在vim中看起来像是ay(gamma?),上面有一个umlat。 由于与此字符关联的ASCII码为255,因此我假设管道未按预期工作,并返回了可能的最大值。 有人能告诉我发生了什么吗,因为我在生命的最后6个小时中一无所获?

第一个错误

这里有个大问题...

char c = getc(fp);

看到了吗? 那是个大问题。 为什么? 让我们看一下getc()的定义...

int getc(FILE *stream);

是的,它返回int not char ,并且以大写I和粗体显示这很重要 getc()函数(或宏)信号与EOF EOF ,通常是-1,并且因此变得0xff存储在当char

始终将intgetc()

int c = getc(fp);
if (c == EOF) {
    ...
}

第二次错误

好吧,为什么我们要获得EOF? 因为getc()被调用两次而不是一次...

while ((c = getc(fp)) != EOF) {
    c = getc(fp); // <-- should not be there
    ...
}

第三次错误

此代码也是错误的:

char c = ...;
printf("[%d] [%s]\n", c, &c);

是的, &c类型为char *但这并不意味着您可以使用%s其打印出来。 %s指示符严格用于NUL终止的字符串。 使用%c ,或继续使用%s并以NUL终止您传递的字符串。

char c = ...;
printf("[%d] [%c]\n", c, c);

要么...

char c = ...;
printf("[%d] [%s]\n", c, (char[]){c, '\0'});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM