1

USB デバイスを開いたときに返されたファイル記述子に書き込もうとすると、SIGPIPE エラーが発生します。一日中読むことはできますが、書き込むことはできません。以下はコードです:

#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <sys/socket.h>
#include <string>
#include <stdio.h>
#include <sstream>
#include <pthread.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

void* Thread(void*);
int fd = -1;
std::string masterName;
std::string slavename;

int main() {

    char buf[1024];
    fd = open("/dev/usbdevice", O_RDWR | O_NOCTTY);

    pthread_t thread;
    pthread_create(&thread, NULL, Thread, (void*)NULL);

    while(1) {
        int returnVal = read(fd, buf, sizeof(buf));
        if(returnVal <= 0) {
                 std::cout << "Read() returned 0 bytes." << std::endl;
                 break;
        }
        std::cout << "Buffer Data: " << byteChars << std::endl;
    }
    close(fd);
    return 0;
}

void* Thread(void*) {
    char buffer[2];
    while(1) {
        memset(buffer, 0, 2);
        std::cout << "Write to device: " << std::endl;
        std::cin >> buffer;
        ssize_t ret = write(fd, buffer, 2);
        if(ret == -1) {
            std::cout << "errno: " << errno << std::endl;
        }
        else {
                std::cout << "Successful write" << std::endl;
        }
    }
    return NULL;
}

基本的には、最初に「open()」関数から返されたファイル記述子「fd」に書き込みできるようにスレッドを設定しました。書き込みを試みるたびにエラーが発生します。しかし、前にも言ったように、問題なく一日中読むことができます。

サイドノート fd をチェックして、正しいものに書き込んでいることを確認しました。間違いなくそうです。

SIGPIPE エラーを調査したところ、リモート エンドで fd が閉じられたときに発生すると誰もが言っていることがわかりました。では、そのファイル記述子を閉じるにはどうすればよいのでしょうか? #2デバイスが閉じている場合、同じファイル記述子でデバイスから読み取ることができますか?

4

0 に答える 0