揮発性のメモ2

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

C

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"); }

printfはスレッドセーフ

C

printf(3)はC99にだいたい準拠している。 Man page of PRINTF fprintf(), printf(), sprintf(), vprintf(), vfprintf(), vsprintf() 関数は、C89 と C99 に準拠している。 snprintf() と vsnprintf() は C99 に準拠している。 C99はIEEE Std 1003.1-2001にだ…

スレッドIDを取得する

スレッドの数を数える方法 - 揮発性のメモ LWP番号を見たい。 $ ps -Lm 26443 PID LWP TTY STAT TIME COMMAND 26443 - pts/5 - 0:00 ./a.out - 26443 - Sl+ 0:00 - - 26444 - Sl+ 0:00 - - 26445 - Sl+ 0:00 - - 26446 - Sl+ 0:00 -このLWP番号をプログラム…

sh4でバックトレース

C

普通のやつらの下を行け: C でバックトレース表示 - bkブログ こちらを参考に、sh4でもバックトレースできたらいいなと思ったが、だめっぽかった。

__TIMESTAMP__

C

int main() { printf(__TIMESTAMP__ "\n"); printf(__DATE__ "\n"); printf(__TIME__ "\n"); return 0; } 表示サンプル $ ./a.out Wed Sep 19 17:09:54 2010 Sep 19 2010 17:14:56__TIMESTAMP__は ファイルのタイムスタンプ __DATE__、__TIME__は ファイルを…

VTIMEの秘密

Man page of TERMIOSbits/termios.h typedef unsigned char cc_t; typedef unsigned int speed_t; typedef unsigned int tcflag_t; #define NCCS 32 struct termios { tcflag_t c_iflag; /* input mode flags */ tcflag_t c_oflag; /* output mode flags */ …

いろいろな言語でflock()

中ではflock(2)を呼んでるのだからあたりまえだけど C,perl,php,bash(flockコマンド) でflock()がお互いにちゃんと機能しあうことを確認した。 次は違う言語同士でのプロセス間通信だ

warning: enumeration value `FUGA' not handled in switch

C

enumをcase文で使うと、未使用分をWARNINGで教えてくれる。 10: typedef enum { HOGE,PIYO,FUGA, } tekito_e; ・・・ 101: switch( a ){ 102: case HOGE: 103: case PIYO: 104: hogehoge(); 105: break; 106: } tekito.c:106: warning: enumeration value `F…

mtraceのテスト

malloc使用時のメモリリーク調査、デバッグメモ 1: main() 2: { 3: char *a,*b; 4: mtrace(); 5: 6: a=malloc(1024); 7: b=malloc(1024); 8: free(a); 9: } aは開放しているけどbは開放していない。 mtrace()で記録開始。本来muntrace()が必要だけど無くても…

clock_gettime

gettimeofdayの代わりにこれ使えということで Man page of CLOCK_GETRES なんでman(2)とman(3)両方にあるんだろう。システムコールかこれ? #include <time.h> #include <stdio.h> #include <stdlib.h> int main() { struct timespec ts; if( clock_gettime(CLOCK_REALTIME,&ts)<0 ){ pe</stdlib.h></stdio.h></time.h>…

intの切捨て

C

端数処理 - Wikipedia doubleをintにキャストするときにおこなわれる切捨ては「0への丸め」。 1.5は1になり、-1.5は-1になる。一般的な切捨て(負の無限大への丸め)にはfloor()を使う。 1.5は1になり、-1.5は-2になる。

printfで3桁区切り

C

setlocale(LC_NUMERIC,"ja_JP.utf8"); printf("%'f\n", 1234567.0); printf("%'d\n", 1234567); 1,234,567.000000 1,234,567LC_NUMERICの内容を環境変数から引っ張るときは、""を指定する。 あと、ロケールをフランスにするとちゃんと小数点が , になる prin…

sqlite3_execでCSVファイルを読めない

COPY文はSQLITE3以降廃止されているし、.importは使えない。 SQLITE3のCのAPIからはCSVファイルを取り込む方法が無い。面倒くさいことこの上ない。

リストにつかう用に構造体を宣言する

C

自己参照構造体のtypedef宣言 // 駄目なパターン typedef struct { int data; hoge_t *next; } hoge_t; // いけるパターン typedef struct __hoge_t { int data; struct __hoge_t *next; } hoge_t;

走行中のプロセスの標準出力を横取りする方法

横取りというか覗き見る。リベンジ http://www.linux.or.jp/JM/html/LDP_man-pages/man2/ptrace.2.html 50行straceもどき - memologue Playing with ptrace, Part I | Linux Journal このあたりを参考に、write()しているところでデータを盗み見る。 処理の…

ore_ctime

C

#include <stdio.h> #include <unistd.h> #include <time.h> const char *ore_ctime( time_t t ) { static char s[256]; if( t==0 ) t=time(NULL); struct tm *tmp = localtime(&t); strftime( s, sizeof(s), "%Y-%m-%d %H:%M:%S", tmp ); return s; } int main(int argc, char **argv) </time.h></unistd.h></stdio.h>…

flockでスレッドごとにロックする

ファイルディスクリプタさえ違っていれば、スレッド間でも排他制御できるっぽい?

ソケットから相手のIPアドレスを調べる

C

char peername[256]={}; struct sockaddr_storage addr={}; socklen_t addrlen = sizeof(addr); getpeername( sd, (struct sockaddr *)&addr, &addrlen); getnameinfo( (struct sockaddr*)&addr, addrlen, peername, sizeof(peername), NULL, 0, NI_NUMERICH…

ソケットのエラーチェック

result = read(sd,NULL,0); if(result<0) perror("socket error");こんなひどいコードが他の処理系で許されるかは不明。

PTHREAD_CREATE_DETACHED

C

int i; pthread_attr_t attr; // スレッド属性 pthread_t tid; // スレッド識別子 pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); for(i=0;i<200;i++){ pthread_create(&tid, &attr, thread_routine, (void *)i); }

iconvでEUC-JPをSJISにするテストコード

C

char *e( char *s ) { static char buf[256]; size_t in = strlen(s); size_t out = sizeof(buf)-1; char *p = buf; iconv_t cd = iconv_open("SJIS","EUCJP"); iconv( cd, &s, &in, &p, &out ); iconv_close(cd); *p = '\0'; return buf; }これはひどい