我正在创建一个文件,然后使用系统调用打开它。
正在创建:
mov rax, 85
mov rdi, path
mov rsi, 400
syscall
开场白:
mov rax, 2
mov rdi, path
mov rsi, 2 ; I found somewhere that I should use 400 to append
syscall
mov r8, rax ; save the file handle
书写:
mov rax, 1
mov rdi, r8
mov rsi, output
mov rdx, length
syscall
在我完成这些步骤后,我自然地关闭了文件,但是我无法向其追加内容,每次我执行这些操作时,它只是重写了文件的内容,但例如,我计算了前n个素数,并将它们存储在某个内存块中,现在我想将这n个素数写入文件,但如果不追加更多行,我就无法这样做。
另外,是否有办法不在rdx
中指定write
的字符串长度,而是用/0
来终止该字符串?
1条答案
按热度按时间i2loujxw1#
O_APPEND
本身意味着O_RDONLY
(因为它是0
),而不是O_WRONLY
或O_RDWR
。打开只读的append通常没有用。在C中,你需要OR多个标志来得到一个文件描述符,你可以用它来写在文件的结尾,即使它的长度被你写以外的东西改变了。要追加到文件中,请使用
O_APPEND = 0x400
标志作为rsi
中的int flags
参数。它是一个十六进制值400,而不是您尝试的十进制值400。以下是以十六进制表示的原始
int flags
值列表:因此,这应该可行:
我添加了这三个值,以便在文件不存在时创建它,或者在文件存在时以write_only模式打开它。您可以将它们定义为汇编时的
equ
常量,这样您就可以在源代码中实际编写mov esi, O_CREAT| O_WRONLY | O_APPEND
。另外,在包含O_CREAT的任何时候,都要确保为第三个参数(权限)提供一个值。否则,文件可能会被创建为具有随机垃圾权限,包括可能的setuid + exec。通常,您传递八进制
666
(NASM0q666
),并让用户的umask取消其他和可选组的写权限。如果你不想用open函数创建它,那么就省略O_CREAT,然后返回
-ENOENT
。另外,有没有办法不在rdx中指定字符串的长度,而是让字符串以/0结尾?
简而言之:没有。
创建一个
strlen
函数,并将结果传递到rdx
中。内核系统调用在文件描述符上读取/写入的数据为buffer + length,只有路径名为C隐式长度字符串。