首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测C文件是否指向文件或串行设备?

如何检测C文件是否指向文件或串行设备?
EN

Stack Overflow用户
提问于 2014-03-21 18:32:50
回答 2查看 87关注 0票数 5

我正在开发一个C应用程序来评估来自USB激光扫描仪的数据,后者充当串行设备。出于测试目的,我还允许从文件中读取测试数据,因为总是连接扫描仪是不方便的。

我像这样打开文件/设备:

代码语言:javascript
运行
复制
FILE *fp = fopen(argv[1], "a+b");

根据我是否想从文件或设备中读取,我传递一个文件路径或类似于/dev/cu.usbmodemfd121 (我在Mac上)之类的东西。

只要我之前已经初始化了激光扫描仪,它就能正常工作,但我宁愿让我的应用程序这样做。但是,为了做到这一点,我必须首先弄清楚我是从文件还是从设备中读取数据。考虑到FILE * fopen**?**返回的,如何才能做到这一点?

我尝试使用fseek(fp, 1, SEEK_END),因为它的流没有“结束”,但出于某些原因,fseek没有失败。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-21 18:36:26

您可以使用fileno获取文件描述符,然后在其上执行fstat。它填充的struct stat包含的思想类似于st_mode,它显示fd的类型。我猜您的非文件设备S_ISCHR将为真,或至少S_ISREG将是假的。

如果你能控制它,就不要做fopen。直接使用open获取文件描述符,如果确实需要C流,则使用fdopen

票数 6
EN

Stack Overflow用户

发布于 2014-03-28 13:03:20

@cnicutar的解决方案效果很好。下面是我最后得出的结论,以防对某人有帮助(为了清晰起见,删除错误检查):

代码语言:javascript
运行
复制
#include <fcntl.h> /* open syscall */
#include <sys/stat.h>

int fd = -1;
int status;
FILE *fp = NULL;
struct stat fd_stat;
bool serial_device = false;

fd = open("/foo/bar/baz", O_RDONLY);
fp = fdopen(fd, "rb");
status = fstat(fd, &fd_stat);

printf("S_ISCHR: %d\n", S_ISCHR(fd_stat.st_mode));
printf("S_ISREG %d\n", S_ISREG(fd_stat.st_mode));

if(!S_ISREG(fd_stat.st_mode)) {
    serial_device = true;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22566844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档