ログイン
編集不可のページディスカッション情報添付ファイル
"clear/note/2012-06"の差分

MMA
3と4のリビジョン間の差分
2012-06-06 09:40:58時点のリビジョン3
サイズ: 883
編集者: clear
コメント:
2012-06-08 02:19:18時点のリビジョン4
サイズ: 2899
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 35: 行 35:

== 06/08 ==
=== stdioのバッファリングを眺める ===
Cのstdioはバッファリングされているんだよー、ということを目で見て分かるように簡単な例で示すのが目標。とりあえず標準出力。

普通に書こうとすると端末側が入力を行単位で扱うのと、エコーバックがあるのとでぱっと見てもさっぱり分からない。そこで、
 * cursesの`getch()`を使う
 * このとき`cbreak()`によってプログラムへの入力が文字単位でやってくるようにして
 * さらに`noecho()`でエコーバックを無効化しておく
加えて、デフォルトの`BUFSIZ`(手元のstdio.hでは1024だった)は大きすぎてバッファがあふれた時の挙動を観察しづらいので、`setbuffer()`でわざと小さなバッファを設定する。
{{{#!highlight c
#include <stdio.h>
#include <curses.h>

int main(void)
{
    int c;
    char buf[8];

    initscr();
    cbreak();
    noecho();

#ifdef NBUF
    /* disable buffering for stdout */
    setbuf(stdout, NULL);
#else
    /* set tiny buffer for stdout */
    setbuffer(stdout, buf, 8);
#endif

    while ((c = getch()) != ERR)
        putchar(toupper(c));

    return 0;
}
}}}
cursesを使うのでコンパイル時には`-lcurses`が必要。`-DNBUF`をつけたりつけなかったりでコンパイルして挙動を眺める。
 * バッファリングなしの場合、putcharで出力した文字は1文字づつすぐに出てくる
 * バッファリングありの場合、putcharで出力した文字はバッファが埋まるたびにバッファサイズ分が一気に出てくる
  * この例では、8文字入力した後9文字目を入力した際にバッファがフラッシュされて出てくる
  * ちなみにバッファに何かが入っている状態でCtrl+CでSIGINTを送って終了すると、終了時にバッファがフラッシュされて一気に出てくる

2012年6月

06/02

GTK+2.0でウィンドウを出すだけの何か

チュートリアルを見つつ。

   1 #include <gtk/gtk.h>
   2 
   3 int main(int argc, char *argv[])
   4 {
   5     GtkWidget *window;
   6 
   7     gtk_init(&argc, &argv);
   8 
   9     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  10     g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  11 
  12     gtk_widget_show(window);
  13 
  14     gtk_main();
  15 
  16     return 0;
  17 }

コンパイルは、ソースがwidget.cなら

gcc -o widget widget.c `pkg-config --cflags --libs gtk+-2.0`

06/06

  • portsのビルドに失敗するとき
    • まずはエラーメッセージを読め、ググれ
    • BUILD_DEPENDSを見直せ、場合によっては再ビルドしろ
  • vncviewerはタイル化すると(要するにオリジナルのサイズから外れると?)死ぬ

06/08

stdioのバッファリングを眺める

Cのstdioはバッファリングされているんだよー、ということを目で見て分かるように簡単な例で示すのが目標。とりあえず標準出力。

普通に書こうとすると端末側が入力を行単位で扱うのと、エコーバックがあるのとでぱっと見てもさっぱり分からない。そこで、

  • cursesのgetch()を使う

  • このときcbreak()によってプログラムへの入力が文字単位でやってくるようにして

  • さらにnoecho()でエコーバックを無効化しておく

加えて、デフォルトのBUFSIZ(手元のstdio.hでは1024だった)は大きすぎてバッファがあふれた時の挙動を観察しづらいので、setbuffer()でわざと小さなバッファを設定する。

   1 #include <stdio.h>
   2 #include <curses.h>
   3 
   4 int main(void)
   5 {
   6     int c;
   7     char buf[8];
   8 
   9     initscr();
  10     cbreak();
  11     noecho();
  12 
  13 #ifdef NBUF
  14     /* disable buffering for stdout */
  15     setbuf(stdout, NULL);
  16 #else
  17     /* set tiny buffer for stdout */
  18     setbuffer(stdout, buf, 8);
  19 #endif
  20 
  21     while ((c = getch()) != ERR)
  22         putchar(toupper(c));
  23 
  24     return 0;
  25 }

cursesを使うのでコンパイル時には-lcursesが必要。-DNBUFをつけたりつけなかったりでコンパイルして挙動を眺める。

  • バッファリングなしの場合、putcharで出力した文字は1文字づつすぐに出てくる
  • バッファリングありの場合、putcharで出力した文字はバッファが埋まるたびにバッファサイズ分が一気に出てくる
    • この例では、8文字入力した後9文字目を入力した際にバッファがフラッシュされて出てくる
    • ちなみにバッファに何かが入っている状態でCtrl+CでSIGINTを送って終了すると、終了時にバッファがフラッシュされて一気に出てくる

clear/note/2012-06 (最終更新日時 2012-06-23 15:10:27 更新者 clear)