2017-08-26 8 views
2

私はdevice file can be accessed directly in Linuxを見ましたが、試してみたいです。私はファイルシステムのないフリーのディスクパーティションを持っています。私のテストコードは以下の通りです。 2回目にプログラムを実行すると、出力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つのバイトを読んで、2番目の4つのバイトを書き込みます。あなたがfoleの先頭に書きたい場合は

は、書き込みの前に

lseek(fd,0,SEEK_SET); 

を試してみてください。