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;
}

複数のファイル記述子を同時に監視

#include < sys/select.h >

#include < stdio.h >

int main(){
    int n;
    fd_set readfds;
    struct timeval tv;
    
    FD_ZERO(&readfds);
    FD_SET(0, &readfds);
    FD_SET(4, &readfds);
    
    tv.tv_sec = 2;
    tv.tv_usec = 500000;
    
    n = select(5, &readfds, NULL, NULL, &tv);
    
    if (n < 0){
        perror("select");
        return 1;
    } else if (n == 0){
        printf("time out \n");
    } else {
        if (FD_ISSET(0, &readfds)){
            printf("input from fd = 0\n");
        }
        if (FD_ISSET(4, &readfds)){
            printf("input from fd = 4\n");
        }
    }
    return 0;
}

utimes

#include < sys/time.h >

#include < time.h >
#include < stdio.h >

int main(){
    struct timeval times[2];
    struct tm t;
    
    t.tm_sec = 7;
    t.tm_min = 14;
    t.tm_hour = 12;
    t.tm_mday = 19;
    t.tm_mon = 0;
    t.tm_year = 138;
    t.tm_isdst = 0;
    times[0].tv_sec = mktime(&t);
    times[0].tv_usec = 0;
    times[1] = times[0];
    
    if (utimes("file.txt",times) < 0){
        perror("utimes");
        return 1;
    }
    return 0;
}

utime

#include 
#include 

#include 
#include 

int main()
{
    struct utimbuf buf;
    struct tm t;
    
    t.tm_sec = 7;
    t.tm_min = 14;
    t.tm_hour = 12;
    t.tm_mday = 19;
    t.tm_mon = 0;
    t.tm_year = 138;
    t.tm_isdst = 0;
    buf.actime =mktime(&t);
    buf.modtime = buf.actime;
    
    if (utime("file.txt", &buf) < 0){
        perror("utime");
        return 1;
    }
    return 0;
}