#include < sys/types.h > #include < unistd.h > #include < sys/stat.h > #include < fcntl.h > #include < stdio.h > int main() { int fd; off_t offset; ssize_t n; char buf[4096]; if((fd = open("file.txt", O_RDONLY)) < 0){ perror("open"); return 1; } if ((offset = lseek(fd, 10, SEEK_SET)) < 0){ perror("lseek"); return 1; } if ((n = read(fd, buf, sizeof buf)) < 0){ perror("read"); return 1; } write(1, buf, n); return 0; }
ファイルclose
#include < unistd.h > #include < stdio.h > int main() { if (close(1) < 0){ perror("close"); return 1; } return 0; }
write
#include < unistd.h > #include < stdio.h > int main() { ssize_t n; if ((n = write(1, "Hello\n", 6)) < 0){ perror("write"); return 1; } return 0; }
データ読み込み
#include < unistd.h > #include < stdio.h > int main(){ ssize_t n; char buf[4096]; if ((n = read(0, buf, sizeof buf))< 0){ perror("read"); return 1; } write(1, buf, n); return 0; }
ファイルの読み込み・書き込み専用オープン
#include < sys/types.h > #include < sys/stat.h > #include < fcntl.h > #include < stdio.h > int main() { int fd_r, fd_w; if ((fd_r = open("/etc/hosts", O_RDONLY)) < 0){ perror("/etc/hosts"); return 1; } if ((fd_w = open("file.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){ perror("file.txt"); return 1; } return 0; }
setrlimit
#include < sys/time.h > #include < sys/resource.h > #include < unistd.h > #include < stdio.h > int main() { struct rlimit rlim; rlim.rlim_cur = 1; rlim.rlim_max = 2; if (setrlimit(RLIMIT_CPU, &rlim) < 0){ perror("setrlimit"); return 1; } for(;;){ chdir("."); } return 0; }
libsystem_kernel.dylib`chdir:
0x7fff8cd39b38 <+0>: movl $0x200000c, %eax
0x7fff8cd39b3d <+5>: movq %rcx, %r10
0x7fff8cd39b40 <+8>: syscall
-> 0x7fff8cd39b42 <+10>: jae 0x7fff8cd39b4c ; <+20>
0x7fff8cd39b44 <+12>: movq %rax, %rdi
0x7fff8cd39b47 <+15>: jmp 0x7fff8cd34c53 ; cerror_nocancel
0x7fff8cd39b4c <+20>: retq
0x7fff8cd39b4d <+21>: nop
0x7fff8cd39b4e <+22>: nop
0x7fff8cd39b4f <+23>: nop
getrlimit
cpu時間のリミットを取得
#include < sys/time.h > #include < sys/resource.h > #includeint main(){ struct rlimit rlim; if (getrlimit(RLIMIT_CPU, &rlim) < 0){ perror("getrlimit"); return 1; } if (rlim.rlim_cur == RLIM_INFINITY){ printf("rlim_cur = unlimited\n"); } else { printf("rlim_cur = %lld\n", (long long)rlim.rlim_cur); } if(rlim.rlim_max == RLIM_INFINITY){ printf("rlim_max = unlimited\n"); } else { printf("rlim_max = %lld\n", (long long)rlim.rlim_max); } return 0; }
getrusage
#include < sys/time.h > #include < sys/resource.h > #include < unistd.h > #include < stdio.h > int main(){ struct rusage usage; int i; j; j = 1; for (i = 1; i <= 1000000; i++){ chdir("."); j *= i; } if (getrusage(RUSAGE_SELF, &usage) < 0){ perror("getrusage"); return 1; } printf( "user time = %ld.%06ld\n" "system time = %ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec, usage.ru_stime.tv_sec, usage.ru_stime.tv_usec ); return 0; }
getgroups
#include < sys/types.h > #include < unistd.h > #include < grp.h > #includeint main(){ gid_t list[3]; list[0] = 3000; list[1] = 3001; list[2] = 3002; if (setgroups(3, list) < 0){ perror("setgroups"); return 1; } return 0; }
getgroups
#include < sys/types.h > #include < unistd.h > #include < limits.h > #include < stdio.h > int main() { int i; int groups; gid_t list[NGROUPS_MAX]; if((groups = getgroups(NGROUPS_MAX, list))< 0){ perror("getgroups"); return 1; } for (i = 0; i < groups; i++){ printf("%d", (int)list[i]); } putchar('\n'); return 0; }