Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 读取输入而不指定输入长度_Linux_Assembly_Arm_System Calls_Armv7 - Fatal编程技术网

Linux 读取输入而不指定输入长度

Linux 读取输入而不指定输入长度,linux,assembly,arm,system-calls,armv7,Linux,Assembly,Arm,System Calls,Armv7,我正在尝试使用任意长度的用户输入 更具体地说,我试图从输入中读取一个目录,该目录将使用mkdirsyscall(0x27)创建。但由于这种特异性仅适用于mkdir;您还可以为我的程序“创建目录”添加一个问题;我有多个这样的程序 如果没有C库,我们将不胜感激 我试过了 mov r7, #0x04 mov r0, #0x00 ldr r1, =some_variable mov r2, #(1 << 30) swi 0x00 mov r7#0x04 mov r0,#0x00 ldr r

我正在尝试使用任意长度的用户输入

更具体地说,我试图从输入中读取一个目录,该目录将使用
mkdir
syscall(
0x27
)创建。但由于这种特异性仅适用于
mkdir
;您还可以为我的程序“创建目录”添加一个问题;我有多个这样的程序

如果没有C库,我们将不胜感激

我试过了

mov r7, #0x04
mov r0, #0x00
ldr r1, =some_variable
mov r2, #(1 << 30)
swi 0x00
mov r7#0x04
mov r0,#0x00
ldr r1,=某个_变量

mov r2,#(1一般来说,如果你不知道长度,但想读取所有数据,你必须分块读取。分块大小可以是你想要的任何大小,只要一个字节,也可以是你想要的大小

有些数据结构不适合这种分块,因此对于它们,我们需要策略将固定大小的读取的分块组合成可以处理的单元。可变长度记录(例如文本行)可能属于这一类,其中一行的长度偶尔会超过固定的块大小,但处理算法希望看到整行

有时,我们必须将所有数据块组合到一个单独的缓冲区中进行进一步处理,而不是首先分配尽可能大的缓冲区,最有可能的做法是使用动态内存分配和内存拷贝来最终呈现连续的数据缓冲区

超大数据集可能需要特殊处理,例如使用64位计算机。内存映射文件也是一个选项,可以在应用程序级别删除一些缓冲,以便让系统这样做


无论是用C语言还是汇编语言编写,上述规定都适用。

一般来说,如果您不知道数据的长度,但想读取所有数据,就必须分块读取。数据块大小可以是您想要的任何大小,只要一个字节,也可以是您想要的大小

有些数据结构不适合这种分块,因此对于它们,我们需要策略将固定大小的读取的分块组合成可以处理的单元。可变长度记录(例如文本行)可能属于这一类,其中一行的长度偶尔会超过固定的块大小,但处理算法希望看到整行

有时,我们必须将所有数据块组合到一个单独的缓冲区中进行进一步处理,而不是首先分配尽可能大的缓冲区,最有可能的做法是使用动态内存分配和内存拷贝来最终呈现连续的数据缓冲区

超大数据集可能需要特殊处理,例如使用64位计算机。内存映射文件也是一个选项,可以在应用程序级别删除一些缓冲,以便让系统这样做


无论是用C语言还是汇编语言编写,上述内容都适用。

您的意思是读取目录项,例如使用getdents Linux系统调用()?系统调用采用一个大小;您可以传递一个较大的大小,但如果有一个API不能指定已分配的缓冲区用户空间的大小,则没有意义。或者您想读取一个字符串,并将该名称用于mkdir?同样,如果您不告诉
read
缓冲区的限制,则没有意义。什么类型你希望发生什么事情?就像一个系统调用会为你分配内存并将输入输入到内存中一样?如果你是从管道或插座读取数据,
splice(2)
我想有一次我试着让你这么做(),但它远不如
read
简单。而且我认为这实际上是不可能的,因为
SPLICE\u F\u MOVE
的文档有点蒙住眼睛,经过编辑。哦,别担心我想到了“分配”部分不是长度部分:splice/do需要一个长度。而且似乎你无法让内核给你页面,只有相反的情况,在写入管道时,你用vmplice将页面赠给内核。什么问题?读取输入通常不是问题。分配一个合理大小的缓冲区,如本例中的PATH_MAX,以及r如果read返回缓冲区大小,那么可能还有更多的内容需要读取。您是指读取目录项,比如getdents Linux系统调用()?系统调用采用一个大小;您可以传递一个较大的大小,但如果有一个API不能指定已分配的缓冲区用户空间的大小,则没有意义。或者您想读取一个字符串,并将该名称用于mkdir?同样,如果您不告诉
read
缓冲区的限制,则没有意义。什么类型你希望发生什么事情?就像一个系统调用会为你分配内存并将输入输入到内存中一样?如果你是从管道或插座读取数据,
splice(2)
我想有一次我试着让你这么做(),但它远不如
read
简单。而且我认为这实际上是不可能的,因为
SPLICE\u F\u MOVE
的文档有点蒙住眼睛,经过编辑。哦,别担心我想到了“分配”部分不是长度部分:splice/do需要一个长度。而且似乎你无法让内核给你页面,只有相反的情况,在写入管道时,你用vmplice将页面赠给内核。什么问题?读取输入通常不是问题。分配一个合理大小的缓冲区,如本例中的PATH_MAX,以及r如果read返回缓冲区大小,那么可能还有更多的内容需要读取。