tarとgzip

  • tarは内部でexeclpしてgzipを呼び出す
//src/tar.c
// コマンドラインオプションの解析

 875 struct option long_options[] =
 876 {
// ...
 903   {"gzip", no_argument, NULL, 'z'},
 904   {"help", no_argument, &show_help, 1},

//src/tar.c ... ここでフラグが立つ
1509       case 'z':
1510         if (flag_compressprog)
1511           ERROR ((TAREXIT_FAILURE, 0,
1512                   _("Only one compression option permitted")));
1513         flag_compressprog = "gzip";
1514         break;
1515 
1516       case 'Z':
1517         if (flag_compressprog)
1518           ERROR ((TAREXIT_FAILURE, 0,
1519                   _("Only one compression option permitted")));
1520         flag_compressprog = "compress";
1521         break;

//src/buffer.c
// flag_compressprgフラグが立ってたらexeclpでgzipする
 484   /* So we should exec compress (-d).  */
 485 
 486   if (ar_reading)
 487     execlp (flag_compressprog, flag_compressprog, "-d", (char *) 0);
 488   else
 489     execlp (flag_compressprog, flag_compressprog, (char *) 0);
 490 
  • execlp()の挙動
関数 execlp() と execvp() は、指定されたファイル名がスラッシュ (/) を含んでいない場合、 シェルと同じ動作で実行可能なファイルを探索する。 検索パスは環境変数 PATH で指定されたパスである。 この変数が指定されていない場合、デフォルトPATHとして ":/bin:/usr/bin" が使用される。 また、いくつかのエラーが発生した場合の扱いが特殊である。

もしファイルが実行ファイルでない場合 (このとき呼び出そうとした execve(2) はエラー EACCES で失敗する)、これらの関数は残りの検索パスの検索を続ける。 他にファイルが見つからなくなった場合グローバル変数 errno に EACCES を設定し復帰する。