事实证明,对open()和fopen()的整个误解源于ARM上Linux
2.6.14内核中有问题的I2C驱动程序。向后移植一个工作不正常的驱动程序,解决了我在此处试图解决的问题的根本原因。
我正在尝试找出Linux(I2C)中串行设备驱动程序的问题。看来,通过在设备上的写入和读取之间添加定时的OS暂停(hibernate),可以使事情工作(更好)。
撇开: I2C的本质是主设备读取或写入的每个字节都由线路另一端(从设备)上的设备确认-暂停的改进使我认为驱动程序是异步工作的-
我无法与公交车的运行方式保持一致。 任何…
我想无论是喜欢 刷新 写可以肯定(而不是使用固定的工期暂停), 或 以某种方式测试写/读事务已 完成 在多线程友好的方式。
使用的麻烦fflush(fd);
是它要求’fd’是流指针(而不是文件描述符),即
FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
我的问题是我需要使用,ioctl()
而不使用流指针。即
int fd = open("filename",O_RDWR);
ioctl(fd,...);
有什么建议吗?
您有两种选择:
使用fileno()
以获得与相关的文件描述符stdio
流指针
完全不要使用<stdio.h>
,这样您也不必担心刷新-所有写操作都会立即发送到设备,对于字符设备,write()
调用甚至要等到下层IO完成(在理论)。
对于设备级IO,我会说使用它很不寻常stdio
。我强烈建议使用较低级别open()
,read()
并且write()
代替(根据你以后的回复)功能:
int fd = open("/dev/i2c", O_RDWR);
ioctl(fd, IOCTL_COMMAND, args);
write(fd, buf, length);
文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作
文件描述符接口 函数 int fd_new (void) 分配文件描述符 struct dfs_fd * fd_get (int fd) 获取文件描述结构 void fd_put (struct dfs_fd *fd) 放置文件描述符 int fd_is_open (const char *pathname) 判断文件是否已被打开 int select (
问题内容: 有没有办法在原始文件描述符而不是FILE *上执行ftell()的操作(返回文件中的当前位置)?我认为应该有,因为您可以使用lseek()查找原始文件描述符。 我知道我可以使用fdopen()创建与文件描述符相对应的FILE *,但我宁愿不这样做。 问题答案: 只需使用:
问题内容: 有人告诉我,我的服务器拒绝在特定端口接受客户端网络连接可能是由于缺少文件描述符所致。我查找了所有内容,并在此处阅读了有关内容:http : //www.netadmintools.com/art295.html 所以我测试了我的系统,我得到了: 这是什么意思?我的限制很高,但是我有0个可用的文件描述符?为什么?如何为我的服务器解决此问题? 即使关闭服务器后,第二列实际上仍为0,甚至在引
当使用了大量虚拟主机,而且每个主机又使用了不同的日志文件时,Apache可能会遭遇文件描述符(有时也称为文件句柄)耗尽的困境。Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10-20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬件限制为止(hard-limit)。 尽管
处理文件描述符 尽管很不像,但是在大多操作系统中,标准输入输出流 stdin 和 stdout 虽然叫做「流」,但它们都有文件的接口。我们同样也会将它们实现成为文件。 但是不用担心,作为文件的许多功能,stdin 和 stdout 都不会支持。我们只需要为其实现最简单的读写接口。 进程打开的文件 操作系统需要为进程维护一个进程打开的文件清单。其中,一定存在的是 stdin stdout 和 std