第1回「Unix/Linuxプログラミング理論と実践」読書会

日時 2010/03/06 14:00 - 16:00
場所 都内某所
挑戦者 id:marqs id:daisukebe id:shiumachi

メモすらとってないので議事録というレベルではないです。思い出しながらのメモ書き。

題材

Unix/Linuxプログラミング理論と実践

Unix/Linuxプログラミング理論と実践

Unix/Linuxプログラミング理論と実践

今回の範囲

  • 2章

流れ

とりあえず id:daisukebe の作った who を眺める
  • python用utmpへのアクセスモジュールpyutmpというものがあったそうだが、MacOSX10.5以降には非対応らしい
who と w の違いって何よ?(研究課題2.1)
  • id:shiumachi が strace を流すように促すが、MacOSXには入っていない(bsd系)
  • id:shiumachi の Fedora12 で確認したところ、w は /proc//cmdline を全てとってきている模様
研究課題2.5 write によるディスクへの書き込みについて
  • (1)カーネルバッファの内容を確実にディスクにコピーするために使われるシステムコールとプログラムは何か
    • これは簡単。どちらも "sync" 。
    • sync を strace で調べてみると、本当にシステムコールの sync しかしていなかった
  • (2)writeで書き込んだデータが本当にディスクに書き込まれたことをどのようにしたら確認できるか。
    • これがよくわからなかった。
研究課題2.6 同一ファイルの複数回オープン
  • 問題
    • あるファイルFに対し、ファイルディスクリプタを3つ(fd1,fd2,fd3)を使ってそれぞれ O_RDONLY,O_WRONLY,O_RDONLY で開く。
    • それぞれ「読む」「書く」「読む」を実行する。
  • 予想
    • 最後のreadはその前のwriteに影響されないんじゃね?
  • 結果
    • そんなことはなかった。普通に直前のwriteで書き込まれる。テストコードと結果は末尾に記載。
  • 今回初めて知ったこと

% echo > testfile

  • これで空ファイル作れるんだ。知らなかった。自分の操作を人に見せると、思いもよらないことを教えてもらえることがある
最後のパズル:tail
  • tail -fってどうやってるんだ?
  • またstraceで覗いてみる。
  • 何かのファイルをread待ちしているように見える

inotify_init() = 4
inotify_add_watch(4, "testfile", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
fstat64(3, {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
read(4,

  • inotify を使ってイベントを監視していることがわかる
  • tail -f中にファイルが減るとどうなるのか?
    • "tail: : ファイルが切り詰められました"と表示される

次回予告

  • 2009/03/20 10:00 -
  • 3章

2.5のテストコードとその結果

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>

#define BUFSIZE 512

int main(int argc,char **argv){
  int fd,fd1,fd2,fdw;
  char buf[BUFSIZE];
  char initdata[] = "hello hello";
  char testdata[] = "test";

  if(argc != 2){ exit(1); }

  if((fd = open(argv[1], O_WRONLY)) == -1){ exit(1); }
  write(fd,initdata,sizeof(initdata));
  if(close(fd) == -1){ exit(1); }

  if((fd1 = open(argv[1], O_RDONLY)) == -1){ exit(1); }
  if((fdw = open(argv[1], O_WRONLY)) == -1){ exit(1); }
  if((fd2 = open(argv[1], O_RDONLY)) == -1){ exit(1); }

  read(fd1,buf,20);
  printf("%s\n",buf);

  write(fdw,testdata,sizeof(testdata));

  read(fd2,buf,20);
  printf("%s\n",buf);

  return 0;
}
  • 結果は以下の通り。

% ./fileread testfile
hello hello
test
% od -c testfile
0000000 t e s t \0 h e l l o \0 \0
0000015