繁体   English   中英

C如何解析命令行参数?

[英]How does C parse command line arguments?

我很好奇C在解析命令行参数方面到底做了什么。 例如,假设我有一个名为myProgram的程序,该程序接受两个这样的参数

./myProgram arg1 arg2

如果我打电话给

./myProgram arg1$'\0otherstuff' arg2

如果我们要打印argv[1]argv[2] ,而忽略$'\\0otherstuff' ,则arg1arg2仍会打印,但是它在哪里呢? 它存储在arg1后面的内存中吗? 可能会覆盖任何缓冲区吗? 如果arg2前面有一个null字符,该如何读取?

./myProgram arg1 arg2转换为C风格的int argc, char *argv[]是由操作系统或shell(取决于它)完成的。 C不解析参数,而是您解析C语言中的参数。C是一种编程语言,不是实体。 在C编程语言中, int argc, char *argc[]形式用作传递给主函数的参数,但是其他编程语言可能使用其他形式,有关C的信息,请参见main_function
在Linux中,可以使用execve系统调用来指定传递给函数的参数。 ./myProgram arg1 arg2形式解析为execve参数是由外壳程序(例如bash)完成的,该外壳程序构造argv数组并将参数传递给execve调用。
您的外壳可能会忽略$'\\0otherstuff' ,因为在POSIX下flename不能包含NUL字符(假设您的外壳与POSIX兼容)。

调用可执行文件时,您的OS内核将采用其他参数(以纯文本格式)并将其传递到程序存储器中。 在调用主函数之前,将执行一小段代码,该代码将给定参数传递给C中的实际主函数。

使用bash(版本3.2.57(1)-发行版(x86_64-apple-darwin17))进行试验表明,示例中的“其他”未传递给程序。 使用您显示的命令行调用程序时, argv[1]指向的内存包含“ arg1”,然后是一个空字符,然后是“ arg2”。 因此,命令行中的null和“ otherstuff”尚未传递给程序。

(假设:如果shell将其传递给程序,我希望它会在argv[1]继续将其传递到内存中,并且不会覆盖任何缓冲区。如果shell旨在容忍参数中嵌入的空字符,我希望(基于我们设计事物的方式)将参数视为完整的字符串,并提供必要的空间来容纳它。)

“ arg2”之前的参数包含空字符的事实与“ arg2”的处理无关。 在命令行的初始处理之后,shell不会将命令行视为一个字符串。 它已将其分为单词或其他单位,并使用自己的数据结构来处理它们。 因此,先前参数中存在空字符对后续参数没有影响。

此外,shell可能无法传递包含嵌入式空字符的参数。 通常用于执行程序的例程(例如execl )将参数接受为以null终止的字符串。 因此,嵌入的null终止字符串,并且execl例程从不传递超出null字符的任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM