【发布时间】:2021-03-11 15:09:05
【问题描述】:
我正在尝试让用户输入任意长度。
更具体地说,我正在尝试从输入中读取将使用mkdir 系统调用(0x27)创建的目录。但是由于这种特异性仅适用于mkdir;您还可以包括我的程序“创建目录”的问题;我有多个这样的程序。
如果没有 C 库将不胜感激。
我试过了
mov r7, #0x04
mov r0, #0x00
ldr r1, =some_variable
mov r2, #(1 << 30)
swi 0x00
但它可以工作(在终止的字符串上);不过,我想知道其他解决方法。
【问题讨论】:
-
您的意思是读取目录条目,例如使用 getdents Linux 系统调用 (man7.org/linux/man-pages/man2/getdents.2.html)?系统调用需要一个大小;你可以传递一个大的尺寸,但如果 API 不能指定已经分配的缓冲区用户空间的大小,那就没有意义了。
-
或者你想读取一个字符串,然后用那个名字作为 mkdir?同样,您不告诉
read缓冲区的限制是没有意义的。 man7.org/linux/man-pages/man2/read.2.html。你希望发生什么样的事情?就像那个系统调用会为你分配内存并把输入放进去?如果您是从管道或套接字读取,splice(2)我认为曾经试图让您这样做 (man7.org/linux/man-pages/man2/splice.2.html),但它远没有read简单。鉴于SPLICE_F_MOVE的文档,我认为这实际上是不可能的 -
有点蒙眼的帖子,已编辑。
-
哦,没关系,我想的是“分配”部分而不是长度部分:拼接/vmsplice 确实需要长度。而且似乎您无法让内核为您提供页面,只有在写入管道时使用 vmsplice 将页面提供给内核的相反。
-
有什么问题?一般来说,读取输入通常不是问题。分配一个合理大小的缓冲区,如本例中的 PATH_MAX,然后将 read() 放入其中。如果 read 返回缓冲区大小,则可能还有更多内容要读取。
标签: linux assembly arm system-calls armv7