2017-08-26 60 views
2

我看過device file can be accessed directly in Linux,我想試試看。我有一個沒有任何文件系統的可用磁盤分區。我的測試代碼如下。 當我第二次運行程序時,我期望得到輸出read data: 199。但實際上,我得到了兩次輸出read data: 0。程序中沒有出現錯誤。我不知道哪裏錯了。
謝謝你的時間。C程序訪問設備文件不起作用

測試代碼:

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

回答

3

readwrite開始讀取/寫入存儲在描述符中的隱式文件偏移量,並將其增加讀取/寫入的字節數。因此,你現在會讀字節0..3,然後寫入字節4。7

代替readwritelseek搞亂,使用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); 
2

你在程序不seek,所以它做什麼: 閱讀前4個字節的設備,然後寫第二個4個字節。

嘗試

lseek(fd,0,SEEK_SET); 

寫之前,如果你想在FOLE的開始寫。

相關問題