使用C ++读/写设备

时间:2011-06-29 19:00:09

标签: c++ io device

如何在C ++中读取/写入设备?设备位于/dev/ttyPA1 我想到了fstream,但我不知道设备是否有输出我可以在不阻止应用程序的情况下阅读 我的目标是创建和应用您在终端中写入内容并将其发送到/dev/ttyPA1的位置。如果设备有回写的东西,它将从设备读取并写入屏幕。如果不是,它将给用户提示再次写入设备 我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

使用open(2)read(2)write(2)来读取和写入设备(完成后不要忘记close(2))。您也可以使用C stdio函数(fopen(3)和朋友)或C ++ fstream类,但如果这样做,您几乎肯定要禁用缓冲(setvbuf(3)用于stdio或{{1}对于fstreams来说。)

然而,这些都将在阻止模式下运行。您可以使用select(2)来测试是否可以在不阻塞的情况下读取或写入文件描述符(如果不可能,则不应该这样做)。或者,您可以在文件描述符上使用outFile.rdbuf()->pubsetbuf(0, 0)标志打开文件(或使用fcntl(2)在打开后设置标志)以使其无阻塞;然后,对O_NONBLOCKread(2)的任何阻止的调用都会立即失败并显示错误write(2)

例如:

EWOULDBLOCK

答案 1 :(得分:0)

您可以使用fstream,但是您必须查找设备希望如何接收数据的规范。有些设备可以很好地使用ASCII数据,其他设备则需要特定的二进制数据位/字节序列。您可能还必须编写自定义序列化对象,这些对象会使您尝试编写的数据的operator<<operator>>函数重载。或者,您可以使用read()write()方法从/向您在程序中分配的缓冲区数组中读取/写入原始二进制数据。

修改:如果您担心阻止行为,那么您有两种选择。您将需要使用POSIX API,并使用poll()select()检查打开的文件描述符,以查看数据是否可用,或者您必须保留任何文件写入或读取调用在一组单独的线程中,基本上可以充当异步读/写操作。因此,您基本上会向读取器/写入器线程发送一条消息,如果fstream调用需要,该线程将阻塞,但程序的其余部分可以继续运行。您的程序可能不是为线程设计的,如果是这种情况,那么POSIX API将是唯一的方法。