brk

ヒープ領域に新たにメモリを割り当て、そのメモリ上に文字列をコピーして、その文字列を標準出力に出力する例です。

#include 

#include 
#include 

int main(){
    char *s;
    
    if ((s = sbrk(7))== (void *)-1){
        perror("sbrk");
        return 1;
    }
    strcpy(s, "hello\n");
    write(1, s, 6);
    
    if (brk(s) < 0){
        perror("brk");
        return 1;
    }
    return 0;
}

mprotect

引数addrのアドレスから、引数lenの長さのメモリ領域のアクセス保護を、引数protの状態に変更。

#include < sys/mman.h >
#include < unistd.h >
#include < stdio.h >

int main(){
    size_t pagesize;
    char *mp;
    
    pagesize = getpagesize();
    
    mp = mmap(0, pagesize, PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
    if (mp == MAP_FAILED){
        perror("mmap");
        return 1;
    }
    
    if (mprotect(mp, pagesize, PROT_READ) < 0){
        perror("mprotect");
        return 1;
    }
    
    *mp = 1;
    return 0;
}

mmapでファイルコピー

mmapを利用して、効率良くファイルをコピー。通常ファイルが標準入力にリダイレクトされていることを想定。

#include < sys/mman.h >
#include < sys/types.h >
#include < unistd.h >
#include < stdio.h >

int main(){
    off_t p, file_size;
    size_t pagesize, len;
    char *mp;
    
    pagesize = getpagesize();
    
    if ((file_size = lseek(0, 0, SEEK_END))<0){
        perror("lseek");
        return 1;
    }
    
    len = pagesize;
    for(p = 0; p < file_size; p += len){
        if (file_size - p < pagesize){
            len = file_size - p;
        }
        
        if ((mp = mmap(0, len, PROT_READ,MAP_PRIVATE, 0, p))== MAP_FAILED){
            perror("mmap");
            return 1;
        }
        write(1, mp, len);
        if (munmap(mp, len)< 0){
            perror("munmap");
            return 1;
        }
    }
    return 0;
}

creatで新規ファイルを作成オープン

creatは、引数pathnameで指定したパス名のファイルを引数modeの値をumask値でマスクしたファイルモードで作成し、書き込み専用でオープンして、そのファイル記述子を戻り値として返します。

#include 
#include 
#include 

#include 

int main()
{
    int fd;
    
    if((fd = creat("file.txt",0666)) < 0){
        perror("creat");
        return 1;
    }
    
    return 0;
}

pread

preadはオフセットを指定してファイルを読み書きできるように、readシステムコールを改変したものです。

#define _XOPEN_SOURCE 500
#include < unistd.h >

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

int main()
{
    int fd_r, fd_w;
    ssize_t n;
    char buf[256];
    
    if ((fd_r = open("file1.txt", O_RDONLY)) < 0){
        perror("open(file1.txt)");
        return 1;
    }
    if ((fd_w = open("file2.txt", O_WRONLY|O_CREAT, 0666)) < 0){
        perror("open(file2.txt)");
        return 1;
    }
    if ((n = pread(fd_r, buf, sizeof buf, 10))< 0){
        perror("pread");
        return 1;
    }
    
    if (pwrite(fd_w, buf, n, 10)<0) {
        perror("pwrite");
        return 1;
    }
    return 0;
}

writev

#include < sys/uio.h >
#include < stdio.h >

int main()
{
    ssize_t n;
    struct iovec vector[3];
    
    vector[0].iov_base = "Hello";
    vector[0].iov_len = 5;
    
    vector[1].iov_base = " ";
    vector[1].iov_len = 1;
    vector[2].iov_base = "World\n";
    vector[2].iov_len = 6;
    
    if ((n = writev(1, vector, 3))< 0){
        perror("writev");
        return 1;
    }
    return 0;
}

readv

長さが違う3個の読み込み用バッファを用意して、readvで読み込む。

#include < sys/uio.h >
#include < stdio.h >

int main()
{
    int i;
    ssize_t n;
    char buf1[5], buf2[10], buf3[15];
    struct iovec vector[3];
    
    vector[0].iov_base = buf1;
    vector[0].iov_len = sizeof buf1;
    
    vector[1].iov_base = buf2;
    vector[1].iov_len = sizeof buf2;
    vector[2].iov_base = buf3;
    vector[2].iov_len = sizeof buf3;
    
    if ((n = readv(0,vector, 3)) < 0){
        perror("readv");
        return 1;
    }
    
    for (i = 0; i < 3; i++){
        if (n < vector[i].iov_len){
            vector[i].iov_len = n;
        }
        n -= vector[i].iov_len;
            
            printf("buf%d[] = %.*s\n",
                   i, (int)vector[i].iov_len, (char *)vector[i].iov_base);
        }
        return 0;
}

fstatvfs

#include < sys/statvfs.h >

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

int main()
{
    int fd;
    struct statvfs buf;
    
    if((fd = open(".", O_RDONLY)) < 0){
        perror("open");
        return 1;
    }
    
    if (fstatvfs(fd, &buf) < 0){
        perror("fstatvfs");
        return 1;
    }
    
    printf(
    (sizeof(fsblkcnt_t) == 8) ?(
           "f_bsize = %lu, f_frsize = %lu,\n"
            "f_blocks = %llu, f_bfree = %llu, f_bavail = %llu, \n"
                                "f_files = %llu, f_ffree = %llu, f_favail = %llu,\n"
                                "f_fsid = %lx, f_flag= %lx, f_namemax = %lu\n"
                                ) : (
                                     "f_bsize = %lu, f_frsize = %lu,\n"
                                     "f_blocks = %llu, f_bfree = %lu, f_bavail = %lu, \n"
                                     "f_files = %lu, f_ffree = %lu, f_favail = %lu,\n"
                                     "f_fsid = %lx, f_flag= %lx, f_namemax = %lu\n"
           ),
           buf.f_bsize, buf.f_frsize,
           buf.f_blocks, buf.f_bfree, buf.f_bavail,
           buf.f_files, buf.f_ffree, buf.f_favail,
           buf.f_fsid, buf.f_flag, buf.f_namemax
           );
    return 0;
}

statvfs

カレントディレクトリが属するファイルシステムの情報取得

#include < sys/statvfs.h >
#include < stdio.h >

int main()
{
    struct statvfs buf;
    
    if(statvfs(".", &buf) < 0){
        perror("statvfs");
        return 1;
    }
    
    printf(
    (sizeof(fsblkcnt_t)== 8)?(
           "f_bsize = %lu, f_frsize = %lu,\n"
            "f_blocks = %llu, f_bfree = %llu, f_bavail = %llu,\n"
                              "f_files = %llu, f_ffree = %llu, f_favail = %llu,\n"
                              "f_fsid = %lx, f_flag = %lx, f_namemax = %lu\n")
           : (
           "f_bsize = %lu, f_frsize = %lu, \n"
              "f_blocks = %lu, f_bfree = %lu, f_bavail = %lu, \n"
              "f_fsid = %lx, f_flag = %lx, f_namemax = %lu\n"),
           buf.f_bsize, buf.f_frsize,
           buf.f_blocks, buf.f_bfree, buf.f_bavail,
           buf.f_files, buf.f_ffree, buf.f_favail,
           buf.f_fsid, buf.f_flag, buf.f_namemax);
    return 0;
}