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

时间:2017-08-26 06:23:45

标签: c linux

我见过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;
}

2 个答案:

答案 0 :(得分:3)

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

使用不使用隐式文件的POSIX标准pread and pwrite而不是readwrite并且弄乱lseek描述符中的偏移量,但从调用中文件的开头获取显式文件偏移量。

#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);

答案 1 :(得分:2)

你的程序中没有seek,所以它的作用如下: 读取器件的前4个字节,然后写入后4个字节。

尝试

lseek(fd,0,SEEK_SET);

在写之前如果你想在fole的开头写。