Unix-system-calls-poll

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

poll()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

poll、ppoll-ファイル記述子で何らかのイベントを待つ

概要

#include <poll.h> int poll(struct pollfd* fds, nfds_t nfds, int timeout); #define _GNU_SOURCE #include <poll.h> int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, const sigset_t *sigmask);

説明

*poll* ()は、 *select* (2)と同様のタスクを実行します。ファイル記述子のセットの1つがI/Oを実行する準備ができるまで待機します。

監視するファイル記述子のセットは、_fds_引数で指定されます。これは、次の形式の_nfds_構造体の配列です。

struct pollfd { int fd; /*file descriptor*/ short events; /*requested events*/ short revents; /*returned events*/ };

フィールド_fd_には、開いているファイルのファイル記述子が含まれています。

フィールド_events_は入力パラメーターであり、アプリケーションが関係するイベントを指定するビットマスクです。

フィールド_revents_は、実際に発生したイベントでカーネルによって満たされる出力パラメーターです。 _revents_で返されるビットには、_events_で指定されたビット、または値 POLLERRPOLLHUP 、または POLLNVAL のいずれかを含めることができます。 (これらの3ビットは_events_フィールドでは無意味であり、対応する条件が真であるときはいつでも_revents_フィールドに設定されます。)

要求されたイベントのいずれも(エラーも)ファイル記述子のいずれに対しても発生していない場合、 poll ()は、イベントの1つが発生するまでブロックします。

_timeout_引数は、 poll ()がブロックする時間の上限をミリ秒で指定します。 _timeout_に負の値を指定すると、タイムアウトが無限になります。

_events_および_revents_で設定/返される可能性のあるビットは、<poll.h>で定義されています。

Tag

説明

ポリン

読み取るデータがあります。

*POLLPRI*

読み取る必要のある緊急データがあります(たとえば、TCPソケットの帯域外データ。パケットモードの擬似端末マスターは、スレーブで状態が変化しています)。

投票

今の書き込みはブロックしません。

*POLLRDHUP* (Linux 2.6.17以降)

ストリームソケットピアが接続を閉じたか、接続の半分を書き込んでシャットダウンしました。 この定義を取得するには、 _ GNU_SOURCE 機能テストマクロを定義する必要があります。

ポラー

エラー状態(出力のみ)。

ポーリング

ハングアップします(出力のみ)。

ポーリング

無効な要求:_fd_は開いていません(出力のみ)。

*_XOPEN_SOURCE* を定義してコンパイルする場合、次のものもあります。これは、上記のビットを超える情報を伝えません。

Tag

説明

*POLLRDNORM*
*POLLIN* と同等です。
*POLLRDBAND*

優先順位バンドデータを読み取ることができます(Linuxでは通常使用されません)。

*POLLWRNORM*
*POLLOUT* と同等です。
*POLLWRBAND*

優先データが書き込まれる場合があります。

Linuxも認識していますが、 POLLMSG は使用しません。

ppoll()

*poll* ()と *ppoll* ()の関係は、 *select* ()と *pselect* ()の関係に類似しています: *pselect* ()、 *ppoll* ()のように、アプリケーションは安全に待機できますファイル記述子が準備完了になるか、シグナルがキャッチされるまで。

_timeout_引数の違いを除いて、次の ppoll ()呼び出し:

ready = ppoll(&fds, nfds, timeout, &sigmask);

以下の呼び出しを実行する_atomically_と同等です:

sigset_t origmask; sigprocmask(SIG_SETMASK, &sigmask, &origmask); ready = ppoll(&fds, nfds, timeout); sigprocmask(SIG_SETMASK, &origmask, NULL);
*ppoll* ()が必要な理由の説明については、 *pselect* (2)の説明を参照してください。

_timeout_引数は、 ppoll ()がブロックする時間の上限を指定します。 この引数は、次の形式の構造体へのポインターです。

struct timespec { long tv_sec; /*seconds*/ long tv_nsec; /*nanoseconds*/ };

_timeout_がNULLとして指定されている場合、 ppoll ()は無期限にブロックできます。

返り値

成功すると、正の数が返されます。これは、ゼロ以外の_revents_フィールド(つまり、イベントまたはエラーが報告された記述子)を持つ構造の数です。 値0は、呼び出しがタイムアウトになり、ファイル記述子の準備ができていないことを示します。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

Tag Description
EBADF An invalid file descriptor was given in one of the sets.
EFAULT The array given as argument was not contained in the calling program’s address space.
EINTR A signal occurred before any requested event.
EINVAL The nfds value exceeds the RLIMIT_NOFILE value.
*ENOMEM * There was no space to allocate file descriptor tables.

Linuxノート

Linux* ppoll ()システムコールは、_timeout_引数を変更します。 ただし、glibcラッパー関数は、システムコールに渡されるタイムアウト引数にローカル変数を使用することにより、この動作を隠します。 したがって、glibc *ppoll ()関数は、_timeout_引数を変更しません。

BUGS

*select* (2)のBUGSセクションにある偽の準備通知​​の説明を参照してください。

準拠

*poll* ()はPOSIX.1-2001に準拠しています。 *ppoll* ()はLinux固有です。

バージョン

*poll* ()システムコールはLinux 2.1.23で導入されました。 *poll* ()ライブラリー呼び出しはlibc 5.4.28で導入されました(カーネルに *poll* ()システム呼び出しがない場合はselect()を使用してエミュレーションを提供します)。
*ppoll* ()システムコールは、カーネル2.6.16でLinuxに追加されました。 *ppoll* ()ライブラリー呼び出しはglibc 2.4で追加されました。

ノート

実装によっては、_timeout_として使用するために値-1で非標準定数 INFTIM を定義します。 この定数はglibcでは提供されていません。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements