C 中 fgetc() 函数的行为
Behavior of fgetc() function in C
我正在寻找一种在 linux 上的 x86-64 程序集中管理文件打开和关闭的简单方法。我认为最简单的方法是编写一个 c 文件,其中包含我可以调用而不必担心稳定性的函数。所以我写了这个函数:
struct PORT open_port(char *filename, int mode) {
struct PORT port;
port.p = 0;
if (mode) {
if (filename == "stdout")
port.f = stdout;
else
port.f = fopen(filename, "wb+");
} else {
if (filename == "stdin")
port.f = stdin;
else
port.f = fopen(filename, "rb");
}
return port;
}
然后我像这样读取端口:
char readchar(struct PORT *port)
{
char r;
if ((*port).p)
r = (*port).p;
else
r = fgetc((*port).f);
(*port).p = 0;
return r;
}
其中 PORT.p
是一个包含当前位置字符的字符,PORT.f
是一个文件指针。然后我通过将参数放入 %rdi
和 %rsi
.
来在我的汇编代码中调用这些函数
当我读取普通文件时一切正常,但 stdin
支持不起作用。我知道 stdin
应该是值 0
并且当我调试我的代码时,我可以看到保存文件指针的值确实是 0
,但是当代码到达fgetc()
call, seg 故障。如果我在我的函数里明明写fgetc(0);
,也会出现segmentation fault。我不明白 fgetc()
函数如何区分 stdin
和普通的 0
。
如何使用此(或非常相似的模式)阅读 stdin
?或者,如果全部错误,我应该怎么做才能在 x64 程序集中打开文件?关于它的工作原理,肯定有一些我没有得到的东西,将不胜感激。
(对于那些想知道这一切有什么意义的人:它能够在不移动文件指针的情况下读取下一个字符,所以有一个 peekchar 函数设置 PORT.p
如果未设置,那么 p
可以保留该值直到被读取)
这在使用 C 编译时有效,但由于 ==
运算符的错误使用而无法使用汇编代码。
因为 C 编译器只定义了字符串 "stdin"
一次,所以字符串指针相等,这使得它看起来有效,但是当从汇编代码调用它时,指针改变了,条件不能被满足。
用 strcmp()
替换 ==
解决了问题
我正在寻找一种在 linux 上的 x86-64 程序集中管理文件打开和关闭的简单方法。我认为最简单的方法是编写一个 c 文件,其中包含我可以调用而不必担心稳定性的函数。所以我写了这个函数:
struct PORT open_port(char *filename, int mode) {
struct PORT port;
port.p = 0;
if (mode) {
if (filename == "stdout")
port.f = stdout;
else
port.f = fopen(filename, "wb+");
} else {
if (filename == "stdin")
port.f = stdin;
else
port.f = fopen(filename, "rb");
}
return port;
}
然后我像这样读取端口:
char readchar(struct PORT *port)
{
char r;
if ((*port).p)
r = (*port).p;
else
r = fgetc((*port).f);
(*port).p = 0;
return r;
}
其中 PORT.p
是一个包含当前位置字符的字符,PORT.f
是一个文件指针。然后我通过将参数放入 %rdi
和 %rsi
.
当我读取普通文件时一切正常,但 stdin
支持不起作用。我知道 stdin
应该是值 0
并且当我调试我的代码时,我可以看到保存文件指针的值确实是 0
,但是当代码到达fgetc()
call, seg 故障。如果我在我的函数里明明写fgetc(0);
,也会出现segmentation fault。我不明白 fgetc()
函数如何区分 stdin
和普通的 0
。
如何使用此(或非常相似的模式)阅读 stdin
?或者,如果全部错误,我应该怎么做才能在 x64 程序集中打开文件?关于它的工作原理,肯定有一些我没有得到的东西,将不胜感激。
(对于那些想知道这一切有什么意义的人:它能够在不移动文件指针的情况下读取下一个字符,所以有一个 peekchar 函数设置 PORT.p
如果未设置,那么 p
可以保留该值直到被读取)
这在使用 C 编译时有效,但由于 ==
运算符的错误使用而无法使用汇编代码。
因为 C 编译器只定义了字符串 "stdin"
一次,所以字符串指针相等,这使得它看起来有效,但是当从汇编代码调用它时,指针改变了,条件不能被满足。
用 strcmp()
替换 ==
解决了问题