gpt4 book ai didi

访问设备文件的C程序不起作用

转载 作者:太空狗 更新时间:2023-10-29 11:35:31 26 4
gpt4 key购买 nike

我看过device file can be accessed directly in Linux我想试一试。我有一个没有任何文件系统的空闲磁盘分区。我的测试代码如下。我希望在第二次运行程序时得到输出 read data: 199。但实际上,我得到输出 read data: 0 两次。程序中没有错误出现。我不知道哪里错了。
谢谢你的时间。

测试代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(){
int num = 0;
int fd = open("/dev/sda6", O_RDWR);

if(fd == -1){
fprintf(stderr, "open device failed, errno : %s(%d) \n",
strerror(errno), errno);
return 1;
}

ssize_t ret = read(fd, &num, sizeof(int));
if(ret != sizeof(int)){
fprintf(stderr, "read fails, errno : %s(%d) \n",
strerror(errno), errno);
return 1;
}
printf("read data: %d\n", num);

num = 199;
ret = write(fd, &num, sizeof(int));
if(ret != sizeof(int)){
fprintf(stderr, "write fails, errno : %s(%d) \n",
strerror(errno), errno);
return 1;
}
close(fd);

return 0;
}

最佳答案

readwrite 从存储在描述符中的隐式文件偏移量开始读/写,并增加读/写的字节数。因此,您现在将读取字节 0 .. 3,然后写入字节 4 .. 7。

不要使用 readwrite 以及 lseek,而是使用 POSIX 标准 pread and pwrite不使用描述符中的隐式文件偏移量,而是在调用中从文件开头获取显式文件偏移量。

#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

...

ssize_t ret = pread(fd, &num, sizeof(int), 0);
ssize_t ret = pwrite(fd, &num, sizeof(int), 0);

关于访问设备文件的C程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45892551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com