![]() |
|
|
Googleのunix.com
|
|||||||
| UNIXの詳細&エキスパートのためのユーザー 専門家への専門家。先進のUNIXは、 UNIXのコマンドは、 Linux 、オペレーティングシステム、システム管理、プログラミング、シェル、シェルスクリプトは、 Solarisのは、 Linux 、 HP - UXのは、 AIXので、 OS X 、 BSDのこちらをご覧ください。 |
その他のUNIXおよびLinuxフォーラムトピックは参考にすること
|
||||
| スレッド | スレッドスターター | フォーラム | 返信 | 最後の投稿 |
| FIFOのに疑問 | Akshay | UNIXのダミー質問と回答のため | 0 | 2008年6月6日 08:56午前 |
| 先入先出法を使用する方法 | 鼓室 | 高レベルのプログラミング | 3 | 2006年6月5日 11:15午前 |
| FIFOの問題 | runawayNinja | 高レベルのプログラミング | 1 | 2004年4月29日 04:10午後 |
| FIFOのNFSの上 | saabir | UNIXの詳細&エキスパートのためのユーザー | 2 | 2003年8月6日 09:03午前 |
| パイプとFIFOの.... | M3xican | 高レベルのプログラミング | 4 | 2002年7月20日 08:22午前 |
![]() |
|
|
LinkBack | スレッドツール | このスレッドを検索 | スレッドを評価 | 表示モード |
|
|
|
||||
|
さて、あなたはかなり単純なテストを考案する可能性がある。 /ワットmkfifoはFIFOを作成します。 2つのプロセスは、作家と読者を作成します。 FIFOのオープンは行わないため、読者の書き込みがブロックされます。ときに、それが目を覚まし、その後は定期的に、いくつかのバイトを書くのと、各書き込みログはstderrに書き込みunblocks 。 読者のプロセスを実行して、それは少し寝ていると、 10回を読んだことがあると言うと、何を読み取る投棄。その後は、先入先出法を閉じて、終了します。 何が表示されるはず、スティーブンスAPUEによると、 SIGPIPEが生成される原因に書き込む必要がありますされています。 例: コード:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
int sigpipe_caught = 0;
#define TESTLOG(s) testlog(__FUNCTION__, s)
void testlog (const char *who, const char *msg)
{
fprintf (stderr, "%s: %s\n", who, msg);
}
void writer (void)
{
int f;
int value = 0;
int err;
int done = 0;
TESTLOG ("starting");
if ((f = open ("fifo", O_WRONLY)) != -1)
{
TESTLOG ("opened fifo");
while (done <= 0)
{
char buf[64];
err = write (f, &value, sizeof value);
if (sizeof value == err)
{
sprintf (buf, "wrote %d", value);
TESTLOG (buf);
value++;
}
else
{
sprintf (buf, "err = %d", err);
TESTLOG (buf);
sprintf (buf, "sigpipe_caught = %d", sigpipe_caught);
TESTLOG (buf);
done++;
}
TESTLOG ("sleeping");
sleep (1);
}
close (f);
TESTLOG ("closed fifo");
}
}
void reader (void)
{
int f;
int i;
int value;
int err;
TESTLOG ("sleeping 2");
sleep (2);
TESTLOG ("awake");
if ((f = open ("fifo", O_RDONLY)) != -1)
{
TESTLOG ("opened fifo");
for (i = 0; i < 10; i++)
{
char buf[64];
err = read (f, &value, sizeof value);
if (sizeof value == err)
{
sprintf (buf, "read %d", value);
TESTLOG (buf);
}
else
{
sprintf (buf, "err = %d", err);
TESTLOG (buf);
}
}
TESTLOG ("closing fifo");
close (f);
}
else
{
TESTLOG ("failed to open fifo");
}
}
void sigpipe (int a)
{
TESTLOG ("caught SIGPIPE");
sigpipe_caught = 1;
}
int main (void)
{
signal (SIGPIPE, sigpipe);
if (fork())
writer();
else
reader();
return 0;
}
私はシステムのカップルでこの実行して、私はそこが問題(たとえばされるようですが、 1つのシグナルハンドラから...). fprintfを使用しないでください しかし、私は、ポイントを示している。 |
|
||||
|
のFIFO /パイプ
またPIPE_BUFに知っておくべきこと、書くことができますバイトの最小数の保証。この実装で異なります。 パイプ部分がないときは、バッファの空き容量が要求されたサイズより大きい場合に書き込みされています。と書く代わりに-1が返されます。 errno EAGAINを設定してください。 最後に、高性能メッセージングまたはIPCは、パイプ/ FIFOは素晴らしい選択されていません。 アトミック性の保証はない存在するため、単一のパイプで複数の読者に問題があることができます。 ジムマクナマラによって編集最終; 2009年6月30日に 11:17午前..理由:スペル |
|
|||||
|
によると POSIX.1 - 2008の書き込み( ) 、 errno EPIPEに設定されているSIGPIPE信号が呼び出しスレッドに送信されます。
|
![]() |
| ブックマーク |
| スレッドツール | このスレッドを検索 |
| 表示モード | このスレッド |
|
|