欢迎来到天天文库
浏览记录
ID:14490352
大小:41.00 KB
页数:3页
时间:2018-07-29
《linux中main()函数中参数来源》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、linux中main()函数中参数来源当一个用C语言编写的Linux或UNIX程序运行时,它是从main函数开始的。对这些程序而言,main函数的声明如下所示:intmain(intargc,char*argv[])其中argc是程序参数的个数,argv是代表参数自身的字符串数组。你可能也会看到Linux的C程序将main函数简单的声明为:main()这样也行,因为默认的返回值类型是int,函数中不用的形式参数不需要声明。argc和argv仍在,但如果不声明它们,你就不能使用它们。无论操作系统何时启动新程序,参数argc和argv都被设置并传递给main。这些参数通常由其
2、他程序提供,这个程序一般是shell,它请求操作系统启动该新程序。shell接受用户输入的命令行,将命令行分解成单词,然后把这些单词放入argv数组。请记住:Linux的shell一般会在设置argc和argv之前对文件名参数进行通配符扩展,而MS-DOS的shell则期望程序接受带通配符的参数并执行它们自己的通配符扩展。例如,如果我们给shell输入如下命令:$myproglefright'andcenter'程序myprog将从main函数开始,main带的参数是:artc:4argv:{"myprog","left","right","andcenter"}注意,参
3、数个数包括程序名自身,argv数组也包含程序名并将它作为第一个元素argv[0]。因为我们在shell命令里使用了引号,所以第四个参数是一个包含了空格的字符串。如果你用ISO/ANSIC语言编写过程序,就会对上面的这些很熟悉。main的参数对应shell脚本里的位置参数$0、$1等。ISO/ANSIC只规定main必须返回int,而X/Open规范则给出了如上所示的明确声明。命令行参数在向程序传递信息方面是很有用的。例如,我们可以在一个数据库应用程序中使用命令行参数来传递想用的数据库的名字,这样就可以在不止一个数据库上使用同一个程序。许多工具程序也使用命令行参数来改变程序
4、的行为或设置选项。通常,你可以使用一个以短横线(-)开头的命令行参数来设置这些所谓的标志(flag)或开关(switch)。例如,sort程序可以用一个开关来进行逆向排序(与正常排序相反):$sort-rfile命令行选项非常常用,因此按相同的方式使用它们对程序的使用者来说是一个不小的帮助。过去,每个工具程序采用它们各自的方式来使用命令行选项,这带来了一些混乱。例如,请看下面这些命令使用参数的方式:$tarcvfB/tmp/file.tar1024$ddif=/dev/fd0of=/tmp/file.ddbs=18k$ls-lstr$ls-l-s-t-r所有命令行开关都应
5、以一个短横线开头,并且包含单个字母或数字。不带后续参数的选项可以在一个短横线后归并到一起。这里的两个ls命令的例子就遵循了以上规则。如果一个选项需要值,则该值应作为独立的参数紧跟在选项后。dd命令的例子违背了这一规则,因为它使用了多字符的选项,而且选项未以短横线开头(if=/dev/fd0),而tar命令则把选项和它们的值完全分开!还有些程序有一个怪异的地方,就是用选项+x(举例来说)执行与-x相反的功能。撇开风格各异的语法格式不谈,单是记住所有这些程序选项的顺序和含义就已经非常困难了。通常,只有求助于-h(帮助)选项或man手册页(如果程序员提供了的话)。我们将在本章稍
6、后看到,getopt提供了对这些问题的一个优雅的解决方案。不过现在,我们还是先看看传递到程序中的参数是怎样处理的。实验:程序参数下面这个程序args.c对其参数进行检查:运行这个程序时,它只是打印其参数和发现的选项。我们的意图是,让该程序接受一个字符串参数和一个由-f选项引入的可选的文件名参数。其他的选项也可以被定义。$./args-i-lr'hithere'-ffred.cargument0:argsoption:ioption:lrargument3:hithereoption:fargument5:fred.c实验解析这个程序简单地利用计数参数argc建立一个循环以
7、检查所有程序参数。它通过检查首字母是否是短横线来发现选项。在本例中,如果打算支持-l选项和-r选项,那么我们就漏考虑了一种情况:-lr选项应该和-l–r一样处理。X/Open规范定义了命令行选项的标准用法(工具语法规则),同时定义了在C语言程序中提供命令行开关的标准编程接口:getopt函数。4.1.1getopt为了帮助我们遵循这些规则,Linux提供了getopt函数,它支持需要关联值和不需要关联值的选项,而且简单易用。#includeintgetopt(intargc,char*constargv[]
此文档下载收益归作者所有