copy and destroy

catch and eat

cat.c その2

日記の練習です。

scrapbox.io

やっと cat コマンドをコンパイルした。 コンパイルするときには gcc -Wall するように、とのことだった。

もしヘッダファイルをインクルードすることを忘れても gcc に常に -Wall オプションを付けておけばちゃんと警告してくれます。開発中は常に -Wall を付けておきましょう。

/api/code/taizooo/5.6_cat_コマンドを作る/cat.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static void do_cat(const char *path);
static void die(const char *s);

int
main(int argc, char *argv[])
{
	int i;
	if (argc < 2) {
		fprintf(stderr, "%s: file name not given\n", argv[0]);
		exit(1);
	}
	for (i=1; i < argc; i++) {
		do_cat(argv[i]);
	}
	exit(0);
}

#define BUFFER_SIZE 2048

static void
do_cat(const char *path)
{
	int fd;
	unsigned char buf[BUFFER_SIZE];
	int n;
	
	fd = open(path, O_RDONLY);
	if (fd < 0) die(path);
	for (;;) {
		n = read(fd, buf, sizeof buf);
		if (n < 0) die(path);
		if (n == 0) break;
		if (write(STDOUT_FILENO, buf, n) < 0) die(path);
	}
	if (close(fd) < 0) die(path);
}

static void
die(const char *s)
{
	perror(s);
	exit(1);
}

自分でコンパイルした cat コマンドで、 その cat のソースコードを cat している様子です。

gyazo.com
gyazo.com

powered by hatena blog.
the nikki system for lifelogging junkies.

all posts © their original owners.
writing is reusable solely under the by creative commons license.