システムコールを使ったコード

システムコールを使った簡単なCのコードを書いている。ここに載せるのは、引数で指定したディレクトリの名前を変えるだけのものだけど、他により突っ込んだ処理をいろいろやる予定。

以下は、たいへんそうだけど今度プログラム化することのリスト。

下は、ディレクトリの名前を変えるプログラムのソースコードディレクトリの名前を変えるだけなのに、自分でやるとなると一つ一つの処理をたどっていかなくてはいけないということがよく分かった。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

char refDir[1024];

int main(int argc, char *argv[])
{

    strcpy( refDir, argv[1] );
    strcat( refDir, "/../" );

    if (chdir(refDir) < 0) {
        fprintf(stderr, "Error: %s\n", argv[0]);
        perror("chdir");
        return 1;
    }

    if (rename(argv[1], argv[2]) < 0) {
        fprintf(stderr, "Error: %s\n", argv[0]);
        perror("rename");
        return 1;
    }
    return 0;
}

実行方法の例は以下の通り。この簡単なプログラムが実行されるときに、どんなシステムコールを呼んでいるかを確認するために、straceコマンドを使ってみる。

$ strace a.out /home/hoge/Code/piyo/work/DirA/ newDir > log 2>&1

プログラムを実行するときに、先頭にstraceを付けるだけで下のような情報が得られる。確かにchdirやrenameが呼ばれている。よく分からないのが、/opt/wx/2.8/lib以下のファイルをopenしようとしているところ。

execve("../src/bin/rename", ["../src/bin/rename", "/home/hoge/Code/piyo/work/DirA/", "newDir"], [/* 43 vars */]) = 0
brk(0) = 0xb8c7000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab2e9143000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab2e9144000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/opt/wx/2.8/lib/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/opt/wx/2.8/lib/tls/x86_64", 0x7fffbd930a90) = -1 ENOENT (No such file or directory)
open("/opt/wx/2.8/lib/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/opt/wx/2.8/lib/tls", 0x7fffbd930a90) = -1 ENOENT (No such file or directory)
open("/opt/wx/2.8/lib/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/opt/wx/2.8/lib/x86_64", 0x7fffbd930a90) = -1 ENOENT (No such file or directory)
open("/opt/wx/2.8/lib/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/opt/wx/2.8/lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=74609, ...}) = 0
mmap(NULL, 74609, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2ab2e9145000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\332\1\0272\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1718232, ...}) = 0
mmap(0x3217000000, 3498328, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3217000000
mprotect(0x321714d000, 2097152, PROT_NONE) = 0
mmap(0x321734d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14d000) = 0x321734d000
mmap(0x3217352000, 16728, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3217352000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab2e9158000
arch_prctl(ARCH_SET_FS, 0x2ab2e91586e0) = 0
mprotect(0x321734d000, 16384, PROT_READ) = 0
mprotect(0x3216e1c000, 4096, PROT_READ) = 0
munmap(0x2ab2e9145000, 74609) = 0
chdir("/home/hoge/Code/piyo/work/DirA//../") = 0
rename("/home/hoge/Code/piyo/work/DirA/", "newDir") = 0
exit_group(0) = ?