私は組み込みデバイス向けに書いているプログラムを持っています。パイプを使ってメッセージを渡そうとしています。自分のプログラムと別のプログラムとの間でメッセージを渡す前に、すべてが正しく動作していることを確認するためのテストコードを作成していましたが、問題が発生しました。組み込みデバイスは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つである:私は、送信スレッドを開始する前に、私は受信スレッドを起動した場合、次のように結果があることに注意してください(送信または受信のいずれか)が正しく開かれていて、パイプのもう一方の端が開かれるまで保持します。ただし、パイプのもう一方の端が正しく開かれていないため、パイプが正常に動く前に開いているパイプが接続を待機しているため、システムがハングしてしまいます。しかし、なぜこれが起こっているのか理解できず、その助けを求めています。
perror()を使用すると、結果が ':Device or Resource Busy'となります – user3830784
権限がありますか? – Stefan
コードはrootとして実行されているため、アクセス権に問題はありません。 – user3830784