質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

1186閲覧

FIFOファイルを用いてプロセス間通信するコードが動きません

keik

総合スコア9

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/19 11:43

現在C言語で、FIFOファイルを用いてプロセス間を通信する方法について勉強しているのですが、コードを書いてみても思う通りに動きません。

具体的には、client.cをコンパイルし実行すると普通にデータを受け取ってもらえているように見えるがFIFOファイルが作成されず、その後server.cを実行しても当然データが受け取れない。しかしFIFOファイルが作成されており、中を見ようと開くとOSがフリーズする。といった状況です。

調べてはみましたが、よくわからなかったのでよろしければご教授お願い致します。

--環境--
CentOS7.4 (vmware上)
gcc 4.8.5-28

送信側 client.c

C言語

1#include <sys/types.h> 2#include <sys/stat.h> 3#include <fcntl.h> 4#include <unistd.h> 5#include <stdio.h> 6#include <stdlib.h> 7#include <string.h> 8 9int main(void) 10{ 11 int fifodes ; 12 char buffer[256]; 13 14 /* FIFOファイルを開く */ 15 fifodes = open("my_fifo",O_WRONLY); 16 17 fgets(buffer,256,stdin); 18 19 /* 送信する */ 20 write(fifodes,buffer,strlen(buffer)+1); 21 22 close(fifodes); 23 24return(0); 25}

受信側 Server.c

C言語

1#include <sys/types.h> 2#include <sys/stat.h> 3#include <fcntl.h> 4#include <unistd.h> 5#include <stdio.h> 6#include <stdlib.h> 7#include <string.h> 8 9int main(void) 10{ 11 int fifodes ; 12 char buffer[256]; 13 14 /* 「my_fifo」というFIFOファイルを作成する */ 15 mkfifo("my_fifo",0777); 16 17 /* FIFO ファイルを開く */ 18 fifodes = open("my_fifo",O_RDONLY); 19 20 /* データを受信する */ 21 read(fifodes,buffer,256); 22 23 printf("Message: %s",buffer); 24 25 close(fifodes); 26 27return(0); 28}

何か足りない情報があれば言ってもらえれば追記します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

相手がいなければブロックされるのでタイミングは関係ありません。

ターミナル1

bash

1$ mkfifo my_fifo 2$ echo hoge > my_fifo 3# ここで止まる

ターミナル2

bash

1$ cat my_fifo 2hoge 3$ # その後ターミナル1でプロンプトが表示される。

投稿2018/09/19 14:51

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

受信側でファイルを作成してはダメでしょう。
ファイルの存在確認して、存在すれば読み込むようにしないと

そのうえ、この2つのコード、よっぽどタイミング合わせて実行しないとまともに動きませんわな。
どういうふうに双方のコードを実行させるのかよく考えないとダメですねー

投稿2018/09/19 11:51

編集2018/09/19 12:05
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keik

2018/09/19 12:39

回答ありがとうございます。 今考えるとファイルを作成せずにファイルに書き込めるわけがないですね 修正します。 しかし、タイミングが合わないと動かないとはどういうことでしょうか... 送信(client)側がFIFOファイルを作成し、受信(server)側がそれを開いて読み込んでいるという理解なので、受信側が後であればいつでも大丈夫に見えるのですが...
y_waiwai

2018/09/19 15:43

ああ、送信側を先に走らせて、受信側をあとに走らせるという前提ですか。ならそれでいけるでしょうね FIFOというので、送受信が同時に読み書きするというのをイメージしてしまいました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問