http://blog.chinaunix.net/u3/101042/showart_2020063.html
----------------------------------------------------------------------------------------------------------------------------------------
首先是进入main
获得program_name //这个是执行程序的文件名
然后设置环境变量,初始化退出的状态,代码如下:
1566 program_name = argv[ 0] ; 1567 setlocale ( LC_ALL , "" ) ; 1568 textdomain ( PACKAGE) ; 1570 exit_status = TAREXIT_SUCCESS; |
下面这个函数是tar里封装的一个申请内存的函数:
74 /* Allocate N bytes of memory dynamically, with error checking. */ 75 76 VOID * 77 xmalloc ( n) 78 size_t n; 79 {
80 VOID * p; 81 82 p = malloc ( n) ; 83 if ( p = = 0) 84 p = fixup_null_alloc ( n) ; 85 return p; = > 86 } |
decode_options (argc, argv);这个函数是在main函数里面的,用来获得我们执行tar的时候带的参数的里面我们会看到一个getopt
1072 /*----------------------------. 1073 | Parse the options for tar. | 1074 `----------------------------*/ 1075 1076 # define OPTION_STRING \ 1077 "-01234567ABC:F:GK:L:MN:OPRST:V:WX:Zb:cdf:g:hiklmoprstuvwxz" 1078 1079 # define SET_COMMAND_MODE( Mode) \ 1080 ( command_mode = command_mode = = COMMAND_NONE ? ( Mode) : COMMAND_TOO_MANY) 1081 1082 static void 1083 decode_options ( int argc, char * const * argv) 1084 {
1085 int optchar; /* option letter */ 1086 1087 /* Set some default option values. */ 1088 = > 1089 blocking = DEFAULT_BLOCKING; 1090 flag_rsh_command = NULL ; 1091 |
接着通过下面这个循环获得指令中的参数
1141 /* Parse all options and non-options as they appear. */ 1142 1143 while ( optchar = getopt_long ( argc, argv, OPTION_STRING, long_options, NULL ) , 1144 optchar ! = EOF ) = > 1145 switch ( optchar) |
看一下optchar
1848 ( gdb) print optchar 1849 $68 = 99 |
输出的是99,可以看一下对应的ascii,在终端里输入man ascii的时候,找到
143 99 63 c
这么一行,第一列是八进制,第二列是10进制,第三列式16进制,第四列就是对应的字符了。
这个是在一个while循环里面做的,我使用的是一个打包的参数,不带压缩参数:
1837 ( gdb) p argv[ 0] 1838 $63 = 0xbffff758 "/home/liuqi/dvntar/dvntar" 1839 ( gdb) p argv[ 1] 1840 $64 = 0xbffff772 "-cf" 1841 ( gdb) p argv[ 2] 1842 $65 = 0xbffff776 "example.tar" 1843 ( gdb) p argv[ 3] 1844 $66 = 0xbffff782 "example" 1845 ( gdb) p argv[ 4] 1846 $67 = 0x0 1847 ( gdb) |
以上是命令行输入的参数,可以看到我输入的是:
/ home/ liuqi/ dvntar/ dvntar - cf example. tar example |
然后继续向下走,就会到
1315 case 'c' : = > 1316 SET_COMMAND_MODE ( COMMAND_CREATE) ; 1317 break ;
|
这里需要注意,后面会提到,设置命令模式为COMMAND_CREATE模式,这个在main里面会看到,打包的工作主要是也在这里做
在循环获得参数后,会得到一个f参数
这个时候会进入:
1331 case 'f' : = > 1332 if ( archive_names = = allocated_archive_names) 1333 {
1334 allocated_archive_names * = 2; 1335 archive_name_array = ( const char * * ) xrealloc( archive_name_array, sizeof ( const char * )
|