落書きノート

ふと自分が気になった事を書いてます

C/C++ Unix lsコマンドの骨格プログラム 実験方法

参考書についているAPUEを使ってプログラムを作るやり方です。主に実験方法をメモします。ちょっとつまずきました。

#include "apue.h"
#include <dirent.h>

int main(int argc, char *argv[]){
  DIR *dp;
  struct dirent *dirp;

  if(argc != 2)
    err_quit("usage: ls directory_name");

  if((dp = opendir(argv[1])) == NULL)
    err_sys("can't open %s", argv[1]);
  while((dirp = readdir(dp)) != NULL)
    printf("%s\n", dirp->d_name);

  closedir(dp);
  exit(0);
}

Macで実験しましたが、結構難しいです。apue.3eをダウンロードして、以下のようにコンパイルしました。apue.3eはカレントディレクトリに配置しています。

> clang ex-dir.c -o ex-dir -I apue.3e/include/ -L apue.3e/lib/ -lapue

インクルードディレクトリのパスとライブラリのパスを指定しているわけですね。-lapueも忘れずにつけておかないとコンパイル出来ません。

UbuntuとかArchでも出来ます。というかLinuxの方が簡単かも知れません。ここではUbuntuのやり方です。/usr/local/include等に配置しても通らない場合は、/usr/includeに読み替えてやってみてください。

> sudo apt-get install libbsd-dev
> sudo cp apue.3e/include/apue.h /usr/local/include
> sudo cp apue.3e/lib/libapue.a /usr/local/lib
> gcc ex-dir.c -o ex-dir -lapue

インクルードディレクトリ等に配置するとパスの指定はいらないので楽です。

実行結果

> ./ex-dir apue.3e
.
..
advio
daemons
datafiles
db
DISCLAIMER
environ
exercises
figlinks
filedir
fileio
include
intro
ipc1
ipc2
lib
Make.defines.freebsd
Make.defines.linux
Make.defines.macos
Make.defines.solaris
Make.libapue.inc
Makefile
printer
proc
pty
README
relation
signals
sockets
standards
stdio
systype.sh
termios
threadctl
threads