Linux pty仮想シリアルポートwriteブロック
この2,3日、プログラムのシリアルポートの実行時間が長くなってデータが読めなくなった問題が発生しました.最後に、私の仮想シリアルポートがデータを書くときにブロックされたため、シリアルポートを読むスレッドが仮想シリアルポートを書く操作所にブロックされていることがわかりました.プログラムのクリップをリストします.
1つのスレッドが複数のシリアルポートを読む方法で、仮想シリアルポートを書くことでブロックされるプログラムの例を示しました.
void vir_serial_init(char *filename){
vir_serial_fd = -1;
sfd = -1;
int ret = -1;
char spty_name[100];
memset(spty_name, '\0', 100);
ret = openpty(&vir_serial_fd, &sfd, spty_name, NULL, NULL);
if (ret == -1) {
printf("SerialPort::SerialPort:openpty returned error");
} else {
/* */
if ((access(filename, F_OK)) != -1) {
remove(filename);
}
symlinkat(spty_name, sfd, filename);
}
}
void serial_read_thread(void *ptr){
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 1000;
char buff[100];
while(true){
int rs = select(fd_max+1, &fd_sets, NULL, NULL, &timeout);
if(rs > 0){
if(FD_ISSET(fd1, &fd_sets)){
read_serial1();
}
if(FD_ISSET(fd2, &fd_sets)){
read_serial2();
sprintf(buff, "hello world");
// ,
write(vir_serial_fd, buff, strlen(buff));
}
}
}
}
1つのスレッドが複数のシリアルポートを読む方法で、仮想シリアルポートを書くことでブロックされるプログラムの例を示しました.