rmdirを作る

空のディレクトリを削除するコマンド「rmdir」をシステムコールを用いて作ってみたいと思います。

まずは、オンラインマニュアルを見ます

$ man -a rmdir

##################################################################

RMDIR(1)                                                                                             RMDIR(1)

名前
       rmdir - 空のディレクトリを削除する

書式
       rmdir [options] directory...

       POSIX オプション: [-p]

       GNU オプション (簡略形式): [-pv] [--ignore-fail-on-non-empty] [--help] [--version] [--]

説明
       rmdir コマンドは空のディレクトリを削除する。

       引き数に指定した directory が存在する空のディレクトリでない場合にはエラーになる。

#################################################################

#################################################################

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

NAME
       rmdir - delete a directory

SYNOPSIS
       #include <unistd.h>

       int rmdir(const char *pathname);

DESCRIPTION
       rmdir() deletes a directory, which must be empty.

RETURN VALUE
       On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

#################################################################


マニュアルには第一章と二章の両方にrmdirの項目があることがわかった。
今回は第二章の内容を活用します。


今、カレントディレクトリにtestという空のディレクトリを作ります。

$ mkdir test

このディレクトリを削除するためのコマンドを作成します。


/* myrdir.c */
#include<unistd.h>

int main(void)
{
         rmdir("./test");
         return 0;
}

これをコンパイルして実行すれば、testディレクトリは削除されます。

次に、このプログラムに、ディレクトリが存在しない時のエラー処理を追加します。

エラーメッセージについては、errnoに格納されるエラー番号をperrorに与えることで表示します。

$ man errno

################################################################

ERRNO(3)                                  Linux Programmer's Manual                                 ERRNO(3)

NAME
       errno - number of last error

SYNOPSIS
       #include <errno.h>

・・・・・・・・・・・

   ENOENT          No such file or directory (POSIX.1)


################################################################


$ man -a perror

################################################################

PERROR(3)                                 Linux Programmer's Manual                                PERROR(3)

NAME
       perror - print a system error message

SYNOPSIS
       #include <stdio.h>

       void perror(const char *s);

       #include <errno.h>

       const char *sys_errlist[];
       int sys_nerr;
       int errno;
################################################################



/* errno.c */
#include<stdio.h>       /* perrorのプロトタイプ宣言 */
#include<errno.h>       /* errnorの変数宣言 */

int main(void)
{
        errno = ENOENT;
        perror("TEST");
        return 0;
}
/*ここまで*/

$ gcc -o errno errno.c

$ ./errno
TEST: No such file or directory

このプログラムを上記のmyrmdirに組み込みます。

/* myrmdir2.c */

#include<unistd.h>      /* rmdir */
#include<stdlib.h>      /* exit */
#include<stdio.h>       /* perror */

int main(void)
{
        if(rmdir("test") == -1){
                //rmdir()が-1を返した時は、errnoからエラー番号を取得して、
                //エラーメッセーを表示して、プログラムを終了する。
                perror("myrmdir2");
                exit(1);
        }
}


$ mkdir test

$ ./myrmdir2
$ ./myrmdir2
myrmdir2: No such file or directory