揮発性のメモ2

http://d.hatena.ne.jp/iww/

C

writeとsprintf

C

result = write( fd, buf, sprintf(buf,"ABC=%5s\n",str) ); いいのかこのコード

system関数の戻り値

system()の戻り値は、所詮exit()の引数なのでstrerror()とかにつっこんでもぜんっぜん役に立たない。 でも、シグナルのときはちゃんとシグナル番号が入るのでstrsignal()が役に立つ。 #define _XOPEN_SOURCE 700 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int</string.h></stdlib.h></stdio.h>…

コマンドライン引数の取得

./a.out abc あいうえお '' 山田みたいなのをコマンドラインで渡したときの引数の取り方と、取れ方 java public class hoge { public static void main(String[] args) { System.out.println( "args.length=" + args.length ); for (int i=0; i

日付フォーマット出力

2012-10-03 16:33:58 みたいに出力する perl my ($S,$M,$H,$d,$m,$Y,$x) = localtime(); my $date = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $Y+1900,$m+1,$d,$H,$M,$S ); print "$date\n"; use POSIX qw(strftime); $date = strftime( "%Y-%m-%d %H:%M:…

sscanfで数字と単位の分解

C

人に説明する用 main(){ int a; char b[256]={}; int result; result = sscanf( " 123px", "%d%[%a-zA-Z]", &a, b ); printf( "result=%d, a=%d, b=%s", result, a, b ); return 0; } result=2, a=123, b=px

main=195

C

main.c int main=195; mainが0xC3(retq)として実行されるので、これだけで正常に「なにもせず終了するプログラム」になるはずだった。 このままコンパイルすると、スタック領域にmainが確保されるらしいので実行できずセグメンテーション違反になる。 実行で…

実行ファイルのフルパス名を取得

/proc/数字/exe が実行ファイルのパスになってるので、それを読むだけ。 GetModuleFileName 関数 Man page of READLINK

ブール型

C

ブーリアン型 - Wikipedia #include <stdbool.h> main(){ bool a=2; bool b=3; printf("%s\n", a==b?"true":"false"); } ちゃんとtrueになるんだ、すごい</stdbool.h>

アトミックなメモリアクセスのための組込み関数

http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html 排他制御をきっちりやってても、頭の中ではなんとなく「インクリメントくらい何もしなくてもアトミックだろ」と思ってたけど、実際にやったら全然ダメだった。 #include <pthread.h> #include <stdio.h> volat</stdio.h></pthread.h>…

ソケットのバッファ

C

getsockopt()によりSO_SNDBUFなどを取り出すとき、作ったばかりのソケットなら問題なくsetもgetもできるけど、すでに接続が確立してるソケットに対してはうまく取得ができないような気がする。 取得はエラーにならないが値が取得できず、設定もエラーになら…

epollの弱点

C

割り込みがあってepoll_waitが終了したとき、何秒経ったのかわからない。 (Linux限定だけど)selectでなら残り時間が返してもらえる。 SIGHUPとかで抜けされられてまた待とうと思ったときに困る。 もっともこれは非POSIXな実装で、またpselectでは残り時間…

getaddrinfoの挙動が変わった

AI_ADDRCONFIGを指定してgetaddrinfo()を呼び出したとき、ちょっと前まではIPv6,IPv4の順番でリストが返ってきてたけど、最近(Debian squeezeくらいから?)ではIPv4,IPv6の順にリストが返ってくるようになった。 今まではリストの先頭だけ使ってIPv6環境な…

配列の初期化時に後ろがゼロで埋められるのは仕様

C

C99だと仕様。それより前は知らん。 6.7.8 Initialization ・・・ 10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized e…

UNIXドメインソケットでデータグラム

C

UNIXドメインソケットでデータグラムを使うと、UDPの欠点が全く表に出てこないので便利。 データが送信単位で分割される データがなくならない データの順番は狂わない 接続先がいないときはちゃんと接続エラーになる UDSに対してもSO_RCVBUFや*1SO_RCVTIMEO…

コールバック関数の登録とかのコード

C

// コールバックを管理する構造体 typedef struct { void *a; void (*callback)(void *); } callback_t; // コールバックさせたい関数 void g( void *a ) { printf("%s\n", (char *)a); } // コールバックを初期化登録する関数 int setcallback( callback_t …

変数名を出力する

C

#define val(a) printf("%s=%d\n",#a,a) マクロの中で#を使うと引数を文字列に出来る。便利だなこれ。

key_tの型

C

key_tの型はint

memmove(d,s,0)

C

memmoveで「0バイトをコピー」とかどうなんのかと思ったけど、コピーそのものが発生しないっぽい。 標準Cライブラリの実装 memmove関数データをSTX直前まで読み飛ばして前に詰める、とかこう書いちゃってもいけそう。 for( i=0; p[i]!=STX && i

strftime()は\0で終端するのか

C

Man page of STRFTIME 結論から言って、strftime()は格納文字列長がギリギリだとバグっぽい動きをする。http://codepad.org/Q2bKk2Yi time_t t; struct tm tm; char buf[] = "XXXXXXXXXXXXXXRRRR"; printf("%s\n",buf); // XXXXXXXXXXXXXXRRRR time(&t); loc…

perror

C

#define EPREFIX "ERROR" #define PERROR(a) fprintf(stderr,"%s:%s:%d:%s:%s(%d)\n",EPREFIX,__FILE__,__LINE__,a,strerror(errno),errno) //使い方 PERROR("opendir"); // ERROR:t.c:9:opendir:No such file or directory(2) あまり便利じゃないか・・・

struct - __attribute__((packed)) not working?

C

doxygenで、構造体定義に __attribute__((packed))をつけてると __attribute__ という名前の構造体定義だと勘違いしてしまう問題について Doxyfileを次のように編集 ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES PREDEFINED …

構造体のメンバーのオフセットを知る

C

Man page of OFFSETOF #include <stddef.h> typedef struct { char a; int b; } hoge_t; main() { printf( "%d\n", offsetof( hoge_t, b ) ); // 4 }</stddef.h>

MD5を続きから計算したい 続き

C

http://www14.ocn.ne.jp/~bkclass/doc_md5.html MD5は64バイトずつのブロックに拡張して区切って計算する(最後の64バイトにはデータ長が入っている)。 最終ブロック以外は毎回同じ演算を繰り返し、中間結果も毎回同じになる。 ブロックごとに中間結果を表…

charのアライメントを揃える

C

__attribute__((aligned(16))) とかを使う 1: main() 2: { 3: int a; 4: char b; 5: char c[13] __attribute__((aligned(16))); 6: char d[13]; 7: char e[13]; 8: 9: printf("&a = %08X\n",&a); 10: printf("&b = %08X\n",&b); 11: printf("&c = %08X\n",&c…

標準出力と戻り値を両方取る

popen()で開いたプロセスの戻り値(exitとかreturnで返してる値)はpclose()で取得できることを今日知った。 Man page of POPEN Man page of WAIT もっと早くに知っときたかったな・・・

time()がエラーを返すことはあるか

エラー EFAULT t がアクセス可能なアドレス空間の外を指している。 Manpage of TIME int main() { time_t t; t=time((void*)1); printf("%d\n",t); }$ ./a.out セグメンテーション違反です普通にセグメンテーション違反です エラーどころじゃない

16進文字列からバイナリへ変換

C

for(i=0;i

warning: operation on `i' may be undefined

C

p[i++] = piyo( p, i );みたいなコードで怒られた。うっかりしてた。 ていうか、未定義だの不定だのといったあいまいさを残している仕様の方こそ間違いだ、やっぱり。ちゃんと定義すべきだよな。 30年以上もの間、なんでi=i++は未定義であり続けたんだろうか

可変長配列

C

C99では配列宣言の大きさに変数を使ってもいい。 http://www.bk.tsukuba.ac.jp/~makimura/JohoShori/node72.html プログラミング言語 C の新機能 : 4.1 可変長配列 10年以上これを知らずにいたってことか・・・。しかしMISRA-Cでは当然のように違反コードと…

嫌なコードテスト

C

int main(){ 0 && puts("no print"); 1 && puts("true"); 0 || puts("false"); 1 || puts("no print"); }