当我尝试写入打开 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如果关闭,我如何仍然能够从同一个文件描述符上的设备读取?