Linux pty仮想シリアルポートwriteブロック

8231 ワード

この2,3日、プログラムのシリアルポートの実行時間が長くなってデータが読めなくなった問題が発生しました.最後に、私の仮想シリアルポートがデータを書くときにブロックされたため、シリアルポートを読むスレッドが仮想シリアルポートを書く操作所にブロックされていることがわかりました.プログラムのクリップをリストします.
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つのスレッドが複数のシリアルポートを読む方法で、仮想シリアルポートを書くことでブロックされるプログラムの例を示しました.