揮発性のメモ2

知識をメモ書きしておく

C

printfで文字列の最大文字数を指定する

C

"%.10s"のように、 . をつけて出力する文字列の最大バイト数を指定する

ビルドした時間をプログラム内で取る方法

C

プログラムの起動時に、自分がいつビルドされたか表示したい。でも、ビルド日時の取り方がわからない。 リンカのオプションかなんかでいい方法がありそうな気がするけど、とりあえず自力で表示させる方法を考える。 考えた方法 version.cのversion()で出力し…

2進数の表記

C

gcc4.3から、0b11110000みたいに頭に0bをつけて2進数表記が出来るようになっていたらしい。 Integer constants written in binary are now supported as a GCC extension. They consist of a prefix 0b or 0B, followed by a sequence of 0 and 1 digits. ht…

scanfでcsvを分解する

C

「数字,数字,文字列,文字列」みたいなカンマ区切りの文字列をscanfで分解する。 空白とかのトリミング scanfは文字列を読み込みときにバッファの最大長を指定できるので、これを使えばバッファオーバーランは発生しない。 また、フォーマット文中の空白は「0…

sqlite3のエラー処理

http://www.3rd-impact.net/Document/SQLite/Translation/Current/capi3ref.html#sqlite3_finalize すべての構築済みステートメントは、sqlite3_close() を呼ぶ前に、あるいは SQLITE_BUSY の戻り値で失敗して閉じる時に削除しなくてはいけません。 ステート…

sprintfは末尾のゼロも書く

C

sprintf()やsnprintf()は末尾のゼロも書く。戻り値(書いたバイト数)はゼロの分を含んだり含まなかったりする。

C言語で構造体を初期化する方法

C

よく忘れて本を見るのでメモ typedef struct { int c; int d; } hoge_t; typedef struct { int a; int b; hoge_t hoge; } piyo_t; 入れ子の構造体を用意 初期値を順番に書く方法 piyo_t p1 = { 1,2,{3,4} }; // 普通な書き方 piyo_t p2 = { 1,2, 3,4 }; // …

fcloseのアボート

C

fclose(fp); fclose(fp); 大事なことなので2回言ってみたら、エラーを通り越してアボートした *** glibc detected *** double free or corruption (top): 0xxxxxxxxx *** Aborted

sleep(0)

C

pthread 勉強 - IT戦記 スレッド切り替え?にsleep(0)を使ってるっぽい。usleep(1)とかより早くて便利そう。 でも、プロセスやスレッドの切り替えは libcの関数の呼び出し程度じゃ発生しないはずで、ソース見てもsleep()は引数が0のときすぐリターンしてるだ…

(null)

C

1: int main() 2: { 3: printf("null='%s'\n",0); 4: } $ ./a.out null='(null)'おおお・・・

標準出力をラインバッファリングさせる

C

無限ループするプログラムの標準出力を通常ファイルにリダイレクトさせると、完全バッファリングされるのでうっとおしい。 ので、ラインバッファリングに変更 setlinebuf(stdout);なぜ、リダイレクトせず画面に出力するときは普通に出るのか よくわからない…

コマンドラインからCGICCのCGIを実行する方法

C

POSTのとき www-data$ export REQUEST_METHOD=POST www-data$ export CONTENT_LENGTH=9 www-data$ echo "name=hoge" | ./hoge.cgi GETのとき www-data$ export REQUEST_METHOD=GET www-data$ export QUERY_STRING="name=hoge" www-data$ ./hoge.cgi⇒CGI

fread

C

freadの2番目の引数の意味を度忘れ http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fread.3.html あらためて日本語訳はひどいと思った

ソケットタイムアウト設定

C

tm.tv_sec = timeout; tm.tv_usec = 0; setsockopt(*sock,SOL_SOCKET,SO_SNDTIMEO,(void *) &tm,sizeof(struct timeval)); setsockopt(*sock,SOL_SOCKET,SO_RCVTIMEO,(void *) &tm,sizeof(struct timeval)); select を使わないならこっちで。 SO_RCVTIMEO が…

SELECTでEFAULT

C

EFAULT ポインターの中に無効なものがある場合。 このエラーを確実に検出できるかどうかは、インプリメンテーションに依存します。 http://72.14.235.104/search?q=cache:vvouZ5KgON8J:docs.hp.com/ja/B2355-60104-05/select.2.html+select+EFAULT&hl=ja&ct=…

system()の注意事項

C

systemは、forkしてexecしてwaitする。つまり、 ソケットやファイルディスクリプタを引き継いでしまう。 多分。とりあえず、大抵の場合はFD_CLOEXECフラグを 付けていれば問題ない。多分。

system()の注意事項

C

SIGCHLD を SIG_IGN してしまうと system() がほぼ必ず -1 で ECHILD になる。 2.6以降でのみ起こる話。 2.4以前では、wait()は SIGCHLDがSIG_IGNされてることを無視する