tar打包原理分析

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 * )

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值