[英]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
。
始终将int
与getc()
。
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.