アラームを設定してシステムコールを中断することで、必要な操作を行うことができます。あなたはどこか、メインまたは早期あなたのプログラムのinitプロセスにおけるいくつかの基本的な設定が必要になります。
#include <signal.h>
sig_atomic_t alarm_counter;
void alarm_handler(int signal) {
alarm_counter++;
}
void setup_alarm_handler() {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = alarm_handler;
sa.flags = 0;
if (sigaction(SIGALRM, &sa, 0) < 0)
die("Can't establish signal handler");
}
// call setup_alarm_handler in main
次に、あなたのようにそれを使用することができます:
alarm(10); // set a 10 second timeout
(len = connect(mysocket, &sock_dest, sizeof(struct sockaddr))) < 0 ||
(len = read(mysocket, buffer, 10));
alarm(0); // cancel alarm if it hasn't happened yet
if (len == -1 && errno == EINTR)
// timed out before any data read
else if (len == -1)
// other error
あなたが呼び出しのシーケンスのタイムアウトを持つことができますこの方法を各コールの所要時間を把握するのではなく、接続または読み取りに時間がかかりすぎるとタイムアウトします。したがって、後続のコールがどれくらい待つかを知ることができます。
[fcntl(2)](http://linux.die.net/man/2/fcntl)で 'O_NONBLOCK'を設定してから、[select(2)](http:// linux。 die.net/man/2/select)を使用して、ソケットの読み込み準備が整ったことを確認します(selectではタイムアウトを指定できます)。 –
合意。ところで、 'read'がどれくらい時間がかかるか気にするなら、' connect'がどれくらい時間がかかるか気にする必要があります(タイムアウトすると時間がかかることがあります)。 'connect'を呼び出す前にソケットを非ブロックにすることができ、' select'か 'poll'で両方を扱うことができます。 – Useless