2016-12-09 17 views
0

変数の値を無期限に維持するプログラムを作成しています。 2つの他のプログラムが変数の値を変更する可能性があります。私は名前付きパイプを使用して変数値を受け取り、外部プログラムに送信します。名前付きパイプの読み書きC

ここに、変数のマネージャーのコードがあります。

manager.c:

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <pthread.h> 

char a = 'a'; 

void *editTask(void *dummy) 
{ 
    int fd; 
    char* editor = "editor"; 
    mkfifo(editor, 0666); 
    while(1) 
    { 
     fd = open(editor, O_RDONLY); 
     read(fd, &a, 1); 
     close(fd); 
    } 
} 

void *readTask(void *dummy) 
{ 
    int fd; 
    char* reader = "reader"; 
    mkfifo(reader, 0666); 
    while(1) 
    { 
     fd = open(reader, O_WRONLY); 
     write(fd,&a,1); 
     close(fd);  
    } 
} 

int main() 
{ 
    pthread_t editor_thread, reader_thread; 
    pthread_create(&editor_thread, NULL, editTask, NULL); 
    pthread_create(&reader_thread, NULL, readTask, NULL); 
    pthread_join (editor_thread, NULL); 
    pthread_join (reader_thread, NULL); 
    return 0; 
} 

このプログラムは、別途変数の外部値を取得するために、外部のプログラムに変数の現在の値を通信するためにpthreadsを使用しています。

変数に値を書き込むことができるプログラムである:現在の値を読むことができるプログラムである

#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    if(argc != 2) 
    { 
    printf("Need an argument!\n"); 
    return 0; 
    }   
    int fd; 
    char * myfifo = "editor"; 
    fd = open(myfifo, O_WRONLY); 
    write(fd, argv[0], 1);  
    close(fd); 

    return 0; 
} 

writer.c

リーダー.c:

#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    int fd; 
    char * myfifo = "reader"; 
    fd = open(myfifo, O_RDONLY); 
    char value = 'z'; 
    read(fd, &value, 1); 
    printf("The current value of the variable is:%c\n",value);  
    close(fd); 

    return 0; 
} 
次のよう

私は私のUbuntuシステムにこれらのプログラムを実行しました:

$ ./manager & 
[1] 5226 
$ ./writer k 
$ ./reader 
bash: ./reader: Text file busy 

はなぜ私のシステムは私がこのプログラムを実行することはできませんか?

ありがとうございます。

答えて

2

FIFOとリーダープログラム "リーダー"の両方を呼び出そうとしています。

また、エラーチェックはありません。 mkfifoopenへのコールが成功したかどうかはわかりません。これを追加することは、トラブルシューティングを行う前に重要です。

+0

私の悪いです。私は何度も見ていたが、この間違いを見つけられなかった。私はプロセスがパラレルでパイプを読み書きしようとするとどこかに制限があると思っていました。エラーチェックについては、どのようなエラーチェックが重要ですか?つまり、ほぼすべての関数をエラーチェックすることができ、すべての関数を気にすることはできません。エラーチェックのヒントをありがとう。ちゃんと覚えておきますよ。 – user5393678

+0

@ user5393678現実的な失敗の可能性がある関数は、エラーチェックとともに呼び出す必要があります。それはほとんどすべてです。明らかに、彼らはいつもすべての方法で失敗するので、それは '開いた'、 'mkfifo'、'読む '、'書く 'です。そして、それはほとんど邪魔ではありません、それは 'if' /' perror'の簡単なカットアンドペーストです(またはマクロを使用します)。そして正直なところ、プログラムがどこで失敗しているのか分からずに目隠しのトラブルシューティングを試みるのは面倒でしたか? –

関連する問題