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;
}

基本上我设置了一个线程,以便能够写入文件描述符“fd”,该文件描述符在一开始是从“open()”函数返回的。每次尝试写入时都会出错。但正如我之前所说,我可以毫无问题地阅读一整天。

旁注 我已经检查了 fd 以确保我写的是正确的,而且我肯定是。

当我研究 SIGPIPE 错误时,我看到每个人都说当 fd 在远程端关闭时会发生这种情况。那么#1该文件描述符怎么可能关闭?#2如果关闭,我如何仍然能够从同一个文件描述符上的设备读取?

4

0 回答 0