デバイスドライバによるプロセス間通信 - ka2yanの日記のデバイスドライバは、既存のプロセス間通信と比べて本当に早いのか、を測定した。 調べること 100バイト程度のメッセージ(画像データ等の大容量データを対象にしているのではない)をやりとりするプロセス間通信で一番早いのは何か? 測定するプロセス間通信は、前回の日記に書いたデバイスドライバ(共有メモリ方式)とデバイスドライバ(メッセージRead/Write)、そして、メッセージキュー(POSIX)、UNIXドメインソケット、名前付パイプ(FIFO)の5種類。 メッセージキュー(System V)は、fd として扱えないので、測定しない。 測定プログラムの概要 −2プロセス間で128バイトのメッセージを送受信を繰り返すプログラム −2プロセスは、NON_BLOCKING でメッセージをread/write −read/writeする前に
だいぶ前から、こんなことに興味があった。 プロセス間通信って色々あるけど、せいぜい100バイトぐらいのメッセージをやり取りするのに一番軽いのって何? プロセス間通信のログ取得も簡単にON/OFFしたい デバッグ/評価/市場トラブル時にアプリケーションに手を入れることなくプロセス間通信のログが取れるのは非常にありがたい。 シェルスクリプトからも各プロセスに指示が出せるとうれしい 今から、2年近くも前だろうか、以下の記事を読ませて頂いた。 http://cheesy.dip.jp/tutorialog/archives/6 これを参考に、以下のようなプロセス間通信を実装した。 共有メモリを使うのではなく、メッセージデータをデバイスドライバにread(2)/write(2)する 上記したような用途(100バイト程度のメッセージ)ならデバイスドライバでメッセージをコピーしてもあまりスループットに影
c言語のソケット通信でチャットプログラムを作り中です 仕様:あるクライアントからメッセージがサーバに送信された時点でサーバは接続されたいる全てのクライアントにメッセージを送信する。 以下のようにクライアントからの接続(accept)がある度に、その返り値であるファイルディスクリプタにに対するreadと全クライアントに対するwriteの処理を行うchild関数をforkで起動します。これだとforkが起動した時点での全てのファイルディスクリプタ(接続されている全クライアント)の情報をchild関数に渡せますが、それ以降増え続けていくファイルディスクリプタの情報をchild関数に渡せないので、最初の方に接続したクライアントからのメッセージをそれ以降接続した他のクライアントに送信できないという状態です。 main() { socket() bind() listen() while(1){ ac
The page you are trying to reach does not exist, or has been moved. Please use the menus or the search box to find what you are looking for.
Section: Linux Programmer's Manual (2) Updated: 2008-08-06 Index JM Home Page roff page 名前 getitimer, setitimer - インターバル・タイマーの値を取得または設定する 書式 #include <sys/time.h> int getitimer(int which, struct itimerval *value); int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); 説明 システムは 1 個のプロセスにつき 3 個のインターバル・タイマーを提供する。 それぞれのタイマーは別々の時間領域で減少する。 どのタイマーも満了するとプロセスにシグナルが送られ、 タイマーは (設定
Section: Linux Programmer's Manual (2) Updated: 2009-02-11 Index JM Home Page roff page 名前 timerfd_create, timerfd_settime, timerfd_gettime - ファイルディスクリプタ経由で通知するタイマー 書式 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value); int timerfd_gettime(int fd, struct itimerspec *curr_value
このページではマルチスレッド、プロセス間通信、スレッド間通信およびタイマープログラミングについて紹介します。(いやー。好きだなこういう話題は。) 記述例およびサンプルに含まれるファイルの全部、または一部を使用したことによる損害等について、一切の責任を負いません。また、サンプルの文字コードはS-JISで提供しますので、ご使用の際はWindowsからFTPするなどして適切な文字コードに変換してください。尚、サンプル中には説明の簡略化のため意味のないコードや、実用上問題のあるコードも含まれていますのでご注意ください。 [POSIX]pthread_create [POSIX]スレッドの同期(ミューテックス) [POSIX]タイマー [WIN32]_beginthreadex [WIN32]スレッドの同期(ミューテックス) [WIN32]共有メモリ [WIN32]スレッドの同期(イベント) [PO
selectを使うサンプルコード(タイムアウト付き) 下記サンプルコードでは、UDPソケットを2つ作成しています。 作成した2つのUDPソケットは、selectに登録してselectはブロッキング状態に入ります。 UDPソケットにデータが到着するとrecvを行い、受信した内容を表示します。 以前のサンプルとこのサンプルの違いは、タイムアウトを設定している事です。 このサンプルでは、selectの4つめの引数はNULLではなくstruct timevalへのポインタを渡しています。 struct timevalには、10秒を表す値を代入してあります。 このサンプルでは、selectは最大10秒までしかブロッキングしません。 selectがブロッキングを開始してから10秒の時間が経過するとselectは0を返して終了します。 select以後のif文では、selectの返り値が0であればwhi
メッセージキューはパイプとより扱いが簡単でちょっと嬉しい. メッセージキューに関する関数 サンプル メッセージキューに関する関数メッセージキューに関する関数として,以下がある. int msgget(key_t key, int msgflg); 指定したkeyのメッセージキュー識別子を取得.msgflgにはパーミッションやオプションなどを指定する.これにIPC_CREATを指定すると,指定したkeyのメッセージキューがない場合は作成してくれる. int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg); メッセージの送信. ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg); メッセージの受
Section: Linux Programmer's Manual (2) Updated: 2008-04-23 Index JM Home Page roff page 名前 msgrcv, msgsnd - メッセージ操作 書式 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 説明 システムコール msgsnd() と msgrcv() はそれぞれ、メッセージ・キューへのメッセージの送信と、 メッセージの受信に使用さ
Section: Linux Programmer's Manual (2) Updated: 2000-09-21 Index JM Home Page roff page 名前 ioctl - デバイス (device) を制御する 書式 #include <sys/ioctl.h> int ioctl(int d, int request, ...); 説明 ioctl() 関数はスペシャル・ファイルを構成するデバイスのパラメータを 操作する。特に、キャラクタ型のスペシャル・ファイル(例えば端末(terminal)) の多くの操作可能な特性を ioctl() リクエストによって制御することができる。引き数 d はオープンされたファイル・ディスクリプタでなければならない。 2番目の引き数は、デバイス依存のリクエスト・コードである。 3番目の引き数は、メモリへの型を指定しないポインタであ
UNIX でプロセスを一時的にスリープさせるには sleep(3) が使えます。sleep() は引数に秒単位でしか時間を指定できないので、より短い時間を指定したい場合は usleep(3) (マイクロ秒) や nanosleep(2) (ナノ秒) を使うことになります。sleep(), usleep() はライブラリ関数、nanosleep() はシステムコール*1です。 この usleep() や nanosleep() で 1ms 程度の短い時間プロセスを停止したとして、正確にその時間だけ停止させることはできるでしょうか。http://shiroikumo.at.infoseek.co.jp/linux/time/ にあるコードを参考に、実際に動かしてみます。カーネル 2.6.19 x86_64、CentOS 5 で試します。 まず、nanosleep() で 1ms のスリープを行
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く