月曜日に研究室に行く前に、FIFO とこの低レベル I/O についての洞察を得ようとしてきましたが、よくわからないこの状況に陥りました。
プログラムは次のことを行う必要があります。
サーバ:
- FIFOを作成し、
- 5 つのメッセージを送信します: "Message #i"、5 秒間隔で、
- FIFOを削除し、
クライアント:
- FIFO から読み取り、メッセージを表示します。
- メッセージが 6 秒間ない場合は終了します。
そしてそれは通信しますが、クライアントは私が彼に送ったものとまったく同じではなく、さらに重要なことに、新しいメッセージが到着するたびに最初から読んでいるようです. 私はかなり長い間理解しようとしてきましたが、ドキュメントの内容と一致していないようです...助けてください! :(
サーバ
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int s2c, c2s, i;
char fifo_name1[] = "/tmp/fifo1";
char fifo_name2[] = "/tmp/fifo2";
char msg[80], buf[10];
struct stat st;
// if no fifos, create 'em
if (stat(fifo_name1, &st) != 0)
mkfifo(fifo_name1, 0666);
if (stat(fifo_name2, &st) != 0)
mkfifo(fifo_name2, 0666);
s2c= open(fifo_name1, O_WRONLY);
c2s= open(fifo_name2, O_RDONLY);
// start sending messages, with 5s interval
for (i=0; i<5; i++)
{
printf("Message #%d \n", i);
strcat(msg, "Message #");
strcat(msg, itoa(i, buf, 10));
strcat(msg, "\0");
write(s2c, msg, strlen(msg)+1);
sleep(5);
}
// delete fifos
unlink(fifo_name1);
unlink(fifo_name2);
printf("server exit successfully");
return EXIT_SUCCESS;
}
クライアント
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int c2s, s2c, c=0;
char buf[10];
char fifo_name1[] = "/tmp/fifo1";
char fifo_name2[] = "/tmp/fifo2";
s2c= open(fifo_name1, O_RDONLY);
c2s= open(fifo_name2, O_WRONLY);
// receive messages
while (1)
{
if (read(s2c, &buf, sizeof(char)*10) > 0)
{
printf("%s \n", buf);
c=0;
}
sleep(1);
c++;
if (c>6)
break;
}
printf("client exit successfully");
return EXIT_SUCCESS;
}