揮発性のメモ2

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

C

ビットフィールドの詰め方

C

gcc はビットフィールドが右詰め固定、LSBから順に使っていく #include <stdio.h> typedef union { unsigned int a; struct { unsigned int b1:4; unsigned int b2:4; unsigned int b3:4; unsigned int b4:4; unsigned int b5:4; unsigned int b6:4; unsigned int b7:</stdio.h>…

sscanf

C

int a; sscanf("100000000000000000000000000000000000000","%50d", &a); printf("%d\n",a);

配列の個数を数える

C

#include <stdio.h> int main(void) { char *h[] = {"aiueo","j","nu"}; int a = sizeof(h); int b = sizeof(h) / sizeof(char*); printf("%d\n",a); printf("%d\n",b); return 0; }</stdio.h>

make

C

$ make make: *** No rule to make target 'a.h', needed by 'main.o'. Stop.main.o をコンパイルするのに必要な a.h が見当たりません。

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

https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/_005f_005fatomic-Builtins.html jessieのコンパイラがgcc4.7.2だったのでやってみた アトミックなメモリアクセスのための組込み関数 - 揮発性のメモ #include <pthread.h> #include <stdio.h> volatile long long A=0; void *gett</stdio.h></pthread.h>…

signedとunsignedの比較

C

main(){ int a = -1; unsigned int b = 1; if(a>b){ printf("-1 is greater than 1\n"); } } 演算するときは unsigned側に引っ張られるのか。知らなかった。

ファイル名一覧取得

// printf用 #include <stdio.h> // opendir用 #include <sys/types.h> #include <dirent.h> // perror用 #include <stdlib.h> int main( int argc, char **argv ) { DIR *dir; struct dirent *dp; char *d_type; dir = opendir( argv[1] ); if( dir==NULL ){ perror("opendir"); exit(1); } while( (dp</stdlib.h></dirent.h></sys/types.h></stdio.h>…

if文の中のカンマ

C

int a=1; if( a==0, a==1 ) printf("Hello\n"); if文かどうかはあまり関係ない。 カンマ区切りは、左から順に実行(評価)してって、値としては一番右のを採用する。

fork

C

親が死んでも子は死なない #include <stdio.h> #include <unistd.h> void oya() { printf("OYA %d START\n", getpid()); sleep(5); *(char*)1 = 1; // ★ここで死ぬ printf("OYA END\n"); } void ko() { printf("KO %d START\n", getpid()); sleep(8); printf("KO END\n"); } int</unistd.h></stdio.h>…

getpeername()

C

ソケットからsockaddr構造体を引っ張ってくる関数 Man page of GETPEERNAME Man page of GETNAMEINFO #include <sys/socket.h> #include <netdb.h> #include <stdio.h> void print_peername( int sd ) { struct sockaddr_storage addr; // ソケットアドレス socklen_t addrlen; // ソケットア</stdio.h></netdb.h></sys/socket.h>…

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) あまり便利じゃないか・・・