10
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
calendar_bottom
RSS | ATOM | ADMIN

badulog

日々の覚書と雑記
ENTRY TOP
スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C]SIGPIPE抑止のflag
sendとrecvのflag引数にMSG_NOSIGNALを指定すれば
相手不在の時もSIGPIPE出さないらしい。ただしEPIPEを返すのは返すと。
■ man send
MSG_NOSIGNAL
Requests not to send SIGPIPE on errors on stream oriented sockets when the other end breaks the connection. The EPIPE error is still returned.

■ man recv (こっちは載ってない場合もあり)
MSG_NOSIGNAL
This flag turns off raising of SIGPIPE on stream sockets when the other end disappears.


使いかたはこんな感じ
size = recvfrom (fd,msg,len,MSG_NOSIGNAL,from_p,fromlen_p);
baduizm | C言語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C] 型定義でヘッダをたどるより良い方法
例えば
#include

int main {
size_t sizet;
ssize_t ssizet;
}

size_tとかssize_tが何者か?と調べるときに/usr/include配下をgrepしまくるよりも
簡単な方法
gcc -E aaa.c > bbb.c

ってやると必要なヘッダを展開するようだ。
ちなみにbbb.cは473行。

bbb.cの中だけを探すと
typedef __ssize_t ssize_t;
__extension__ typedef int __ssize_t;

とか
typedef unsigned int size_t;

なことが分かる。

man gcc
-E プリプロセス処理が終了したところで停止します。コンパイルはしま
ん。出力はプリプロセス済みのソースコードであり、標準出力へと送ら
れます。
baduizm | C言語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C] sem_nsemsフィールドを%dでprintfしたら警告
semid_ds構造体のsem_nsemsフィールドを%dでprintfしようとして
make LOMCHK=ON で警告をくらった。

JMみると
struct semid_ds {
struct ipc_perm sem_perm; /* 所有権と許可 */
time_t sem_otime; /* 最後の semop の時刻 */
time_t sem_ctime; /* 最後に変更が行われた時刻 */
unsigned short sem_nsems; /* 集合内のセマフォの数 */
};

らしい。
ためしに/usr/includeでgrepしてみると2つかかった。
(1) bits/sem.h
/* Data structure describing a set of semaphores. */
struct semid_ds
{
struct ipc_perm sem_perm; /* operation permission struct */
__time_t sem_otime; /* last semop() time */
unsigned long int __unused1;
__time_t sem_ctime; /* last time changed by semctl() */
unsigned long int __unused2;
unsigned long int sem_nsems; /* number of semaphores in set */
unsigned long int __unused3;
unsigned long int __unused4;
};

(2) linux/sem.h
/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct semid_ds {
struct ipc_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */
__kernel_time_t sem_ctime; /* last change time */
struct sem *sem_base; /* ptr to first semaphore in array */
struct sem_queue *sem_pending; /* pending operations to be processed */
struct sem_queue **sem_pending_last; /* last pending operation */
struct sem_undo *undo; /* undo requests on this array */
unsigned short sem_nsems; /* no. of semaphores in array */
};

どうやらunsigned shortの方は古いglibcとのコンパチのためらしい。
ムムムと思って良くJM見ると
構造体 semid_ds 内の多くのフィールドは、 Linux 2.2 では short 型だったが、Linux 2.4 では long 型になった。この利点を生かすには、glibc-2.1.91 以降の環境下で再コンパイルすれば十分である。カーネルは新しい形式の呼び出しと古い形式の呼び出しを cmd 内の IPC_64 フラグで区別する。


と書いてあった。。
しかしprintfのlong long intとかのprintfフォーマットが良く分からない。


baduizm | C言語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C] time_tがlongであることと事前定義マクロ
/usr/include/time.hで
typedef __time_t time_t;

/usr/include/bits/types.hで
/* We want __extension__ before typedef's that use nonstandard base types
such as `long long' in C89 mode. */
#define __STD_TYPE __extension__ typedef
・・・(略)・・・
/* Timer ID returned by `timer_create'. */
__STD_TYPE __TIMER_T_TYPE __timer_t;

"__extension__"というのはここここのように、
__extension__ typedef long long int64_t;

こんな風にしておくと、-pedantic を使用した場合に gcc が標準規格に沿っていないコードに対して警告をしなくなるだけらしい。
なので、/usr/include/bits/types.hでは、結局
typedef __TIMER_T_TYPE __timer_t;

ということ。
さらに、/usr/include/bits/typesizes.hで
#define __TIME_T_TYPE __SLONGWORD_TYPE

/usr/include/bits/types.hに戻って
#define __SLONGWORD_TYPE long int

と。つまるところが、
typedef long int time_t;

終了。
で、__extension__というのは、
事前定義マクロで
事前定義マクロというのは、何かヘッダをインクルードせずとも予め定義されるマクロです。
__名前__
のように前後にアンダースコアが2つつきます。

__FILE__とか__LINE__とかもそうだったんだ。こちら

baduizm | C言語 | - | - | - |
ENTRY BOTTOM