2016-10-19 3 views
3

私は組み込みデバイス向けに書いているプログラムを持っています。パイプを使ってメッセージを渡そうとしています。自分のプログラムと別のプログラムとの間でメッセージを渡す前に、すべてが正しく動作していることを確認するためのテストコードを作成していましたが、問題が発生しました。組み込みデバイスはC++ 11をサポートしていないことに注意してください(したがって、pthreadを使用しています)。1つのプログラムからC++で2つのパイプを開きます。

問題のコード:

void* testSender(void *ptr) { 
    std::cout << "Beginning testSender" << std::endl; 
    int pipe = open("/dev/rtp10", O_WRONLY); 
    if (pipe < 0) { 
    std::cout << "write pipe failed to open" << std::endl; 
    } else { 
    std::cout << "write pipe successfully opened" << std::endl; 
    } 
    std::cout << "Ending testSender" << std::endl; 
    return NULL; 
} 

void* testReceiver(void *ptr) { 
    std::cout << "Beginning testReceiver" << std::endl; 
    int pipe = open("/dev/rtp10", O_RDONLY); 
    if (pipe < 0) { 
    std::cout << "read pipe failed to open" << std::endl; 
    } else { 
    std::cout << "read pipe successfully opened" << std::endl; 
    } 
    std::cout << "Ending testReceiver" << std::endl; 
    return NULL; 
} 

void testOpenClosePipes() { 
    std::cout << "Beginning send/receive test" << std::endl; 
    pthread_t sendThread, receiveThread; 
    pthread_create(&sendThread, NULL, &testSender, NULL); 
    pthread_create(&receiveThread, NULL, &testReceiver, NULL); 
    std::cout << "waiting for send and receive test" << std::endl; 
    pthread_join(receiveThread, NULL); 
    pthread_join(sendThread, NULL); 
    std::cout << "Done testing open send/receive" << std::endl; 
} 

関数testOpenClosePipesは()私のメインスレッドから呼び出されると、それを呼び出した後、私は次の出力を取得されています

Beginning send/receive test 
waiting for send and receive test 
Beginning testReceiver 
Beginning testSender 
write pipe failed to open 
Ending testSender 

し、プログラムがハングします。私はこれが読まれたパイプが開かれているので、送信者がパイプに接続するのを待っていると思うが、私は間違っている可能性がある。

Beginning send/receive test 
waiting for send and receive test 
Beginning testSender 
Beginning testReceiver 
read pipe failed to open 
Ending testReceiver 

私がこれまでのパイプについて読んだもの、何が起こっているように見えることから、2つの1つである:私は、送信スレッドを開始する前に、私は受信スレッドを起動した場合、次のように結果があることに注意してください(送信または受信のいずれか)が正しく開かれていて、パイプのもう一方の端が開かれるまで保持します。ただし、パイプのもう一方の端が正しく開かれていないため、パイプが正常に動く前に開いているパイプが接続を待機しているため、システムがハングしてしまいます。しかし、なぜこれが起こっているのか理解できず、その助けを求めています。

答えて

0

失敗したオープンコールの値をerrnoにチェックするのはどうですか?

+0

perror()を使用すると、結果が ':Device or Resource Busy'となります – user3830784

+0

権限がありますか? – Stefan

+0

コードはrootとして実行されているため、アクセス権に問題はありません。 – user3830784

0

私の問題を見てみると、実際問題のパイプは問題のパイプではなく、組み込みシステムの特別なアプリケーションのパイプを開きます。パイプは実際には行くことができませんlinuxからlinuxへこれは、別のパイプを使用し、まずパイプを開こうとする前にmkfifoコマンドでパイプを作成することによって解決されます。

関連する問題