SIGPIPE使用write()时出错

时间:2013-03-12 21:20:12

标签: sockets usb pthreads hid sigpipe

当我尝试写入打开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如果它关闭,我仍然可以在同一个文件描述符上读取设备吗?

0 个答案:

没有答案