Category Archives: 9.ソース管理

マイtruncateを作る(その5)

マイtruncate続きです。
サイズの切り詰め処理は、truncateコマンドのソースを参考にしてみます。
マイtruncateを作る(その3)」で知りましたが、truncateコマンドでは、ftruncate関数を使ってました。

static bool
do_ftruncate (int fd, char const *fname, off_t ssize, off_t
              rel_mode_t rel_mode)      
{   
  struct stat sb;
  off_t nsize;

  
~省略~


  if (ftruncate (fd, nsize) == -1)      /* note updates mtim
    {
      error (0, errno,
             _("failed to truncate %s at %" PRIdMAX " bytes"
             (intmax_t) nsize);
      return false;
    }

  return true;
}

使い方は、man 2 truncate。

TRUNCATE(2)          Linux Programmer's Manual         TRUNCATE(2)

名前
       truncate, ftruncate - 指定した長さにファイルを切り詰める

書式
       #include <unistd.h>
       #include <sys/types.h>

       int truncate(const char *path, off_t length);
       int ftruncate(int fd, off_t length);

マニュアルを見ると、truncate()と、ftruncate()があります。ftruncate()から使ってみます。
openしてftruncateしてcloseするだけです。

takk@deb9:~/tmp$ cat -n test.c
     1	#include <sys/types.h>
     2	#include <sys/stat.h>
     3	#include <fcntl.h>
     4	#include <unistd.h>
     5	
     6	int main()
     7	{
     8		int fd;
     9		fd = open("test.bin",O_RDWR);
    10		ftruncate(fd,3);
    11		close(fd);
    12		return 0;
    13	}
takk@deb9:~/tmp$ 

簡単に書けるんですね。

使ってみます。実験用データが本物のtruncateコマンドで生成します。

takk@deb9:~/tmp$ truncate -s10 test.bin
takk@deb9:~/tmp$ wc -c test.bin
10 test.bin
takk@deb9:~/tmp$ gcc test.c
takk@deb9:~/tmp$ ./a.out
takk@deb9:~/tmp$ wc -c test.bin
3 test.bin
takk@deb9:~/tmp$ 

次は、truncate()を使ってプログラミングしてみます。

takk@deb9:~/tmp$ cat -n test.c
     1	#include <unistd.h>
     2	#include <sys/types.h>
     3	
     4	int main()
     5	{
     6		truncate("test.bin",3);
     7		return 0;
     8	}
takk@deb9:~/tmp$ 

さらに簡単になりました。openもcloseもいらないのですね。

takk@deb9:~/tmp$ truncate -s10 test.bin
takk@deb9:~/tmp$ wc -c test.bin
10 test.bin
takk@deb9:~/tmp$ gcc test.c
takk@deb9:~/tmp$ ./a.out test.bin
takk@deb9:~/tmp$ ls -l test.bin
-rw-r--r-- 1 takk takk 3  4月 19 19:46 test.bin
takk@deb9:~/tmp$ wc -c test.bin
3 test.bin
takk@deb9:~/tmp$ 

動きました。素晴らしい。