About This Site

Linuxのシステムコールを用いて最終的にネットワークのプログラミングを試みようとしています.
情報の公開と言うよりは管理人の備忘録となっている場合が多くなっています.

Test

下記のコードはシステムコールを使った, 擬似のcatコマンドです.
Vimで強制的に特殊文字を変換したのでおかしくなっているところがあるかもしれません.

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

#define BUFF 16384

#ifdef EOF
    #define EOF (-1)
#endif

static void die_err(const char *path);
static void cat_clo(const char *path);

int main(int argc, char **argv)
{
    int i;
    
    if(argc < 2) {
        fprintf(stderr, "usage: %s file name ....\n", argv[0]);
        exit(1);
    }

    for(i = 1; i < argc; i++)
        cat_clo(argv[i]);

    return 0;
}

static void cat_clo(const char *path)
{
    int fd, n;
    char buff[BUFF];

    if((fd = open(path, O_RDONLY)) == EOF) {
        perror("open");
        exit(1);
    }
    while(1) {
        if((n = read(fd, buff, BUFF)) == EOF) die_err(path);
        if(n == 0) break;
        if(write(1, buff, n) == EOF) die_err(path);
    }
    close(fd);
}

static void die_err(const char *path)
{
    perror(path);
    exit(1);
}