我正在从《从头开始编程》这本书中学习x86汇编语言Linux,目前我正在学习如何打开文件并对其进行读写。我在打开文件的选项上遇到了麻烦。我知道0用于只读,03101用于写入和截断,但我从哪里可以获得所有打开选项的完整文档?
9wbgstp71#
这不是关于WSL,而是关于你选择在你的WSL中安装什么Linux发行版。不同的发行版会将内容放在文件系统中的不同位置。locate '*fcntl*.h'是查找适当标头的好方法。
locate '*fcntl*.h'
您始终可以编译包含文档头的C程序(这将拉入“真正的”头),并查看其gcc -E -dM宏定义。甚至是
gcc -E -dM
gcc -E -dM /usr/include/fcntl.h | grep ' O_'
只过滤O_MACRO常量。(我认为fcntl.h很可能位于普通的/usr/include中,而不是隐藏在某个地方,但也许这只是我的Arch GNU/Linux发行版的简单之处。它将特定于Linux的libc头文件(如<asm/unistd.h>)保存在/usr/include/asm/中,在/usr/include/asm/中,您可以分别找到32位和64位序列号的unistd_32.h和unistd_64.h。)或者让常见的包含路径搜索发生:
fcntl.h
<asm/unistd.h>
/usr/include/asm/
unistd_32.h
unistd_64.h
echo '#include <fcntl.h>' | gcc -E -dM - | grep ' O_'
或者编写执行printf("%x, %x\n", O_CREAT, O_TRUNC)或其他操作的代码,以打印出您感兴趣的一些常量,无论它们来自哪个标题。(或者打印出它们的按位OR,如O_CREAT|O_TRUNC)。
printf("%x, %x\n", O_CREAT, O_TRUNC)
O_CREAT|O_TRUNC
许可模式位常量(如S_IRUSR)是根据其他常量(如__S_IREAD)定义的,因此它有点像老鼠窝;打印出来可能是个好主意。或者简单地以八进制写入权限位,如mov edx, 0o666(NASM)或mov $0666, %edx(GAS)。(让UMASK清除文件创建时的写操作)。
S_IRUSR
__S_IREAD
mov edx, 0o666
mov $0666, %edx
要查找的常量的名称可以在手册页open(2)中找到。
open(2)
z9smfwbn2#
使用:Windows子系统我在/usr/Include/ASM-Generic/fcntl.h中找到了适用于x86 ASM Linux的正确文件
2条答案
按热度按时间9wbgstp71#
这不是关于WSL,而是关于你选择在你的WSL中安装什么Linux发行版。不同的发行版会将内容放在文件系统中的不同位置。
locate '*fcntl*.h'
是查找适当标头的好方法。您始终可以编译包含文档头的C程序(这将拉入“真正的”头),并查看其
gcc -E -dM
宏定义。甚至是只过滤O_MACRO常量。(我认为
fcntl.h
很可能位于普通的/usr/include中,而不是隐藏在某个地方,但也许这只是我的Arch GNU/Linux发行版的简单之处。它将特定于Linux的libc头文件(如<asm/unistd.h>
)保存在/usr/include/asm/
中,在/usr/include/asm/
中,您可以分别找到32位和64位序列号的unistd_32.h
和unistd_64.h
。)或者让常见的包含路径搜索发生:或者编写执行
printf("%x, %x\n", O_CREAT, O_TRUNC)
或其他操作的代码,以打印出您感兴趣的一些常量,无论它们来自哪个标题。(或者打印出它们的按位OR,如O_CREAT|O_TRUNC
)。许可模式位常量(如
S_IRUSR
)是根据其他常量(如__S_IREAD
)定义的,因此它有点像老鼠窝;打印出来可能是个好主意。或者简单地以八进制写入权限位,如mov edx, 0o666
(NASM)或mov $0666, %edx
(GAS)。(让UMASK清除文件创建时的写操作)。要查找的常量的名称可以在手册页
open(2)
中找到。z9smfwbn2#
使用:Windows子系统我在/usr/Include/ASM-Generic/fcntl.h中找到了适用于x86 ASM Linux的正确文件