こんにちは、特定のデバイスの読み取りと書き込みを行う char ドライバーを作成しています。私は初心者なので、これはオープン、読み取り、書き込み、解放などの最も単純なプロトコルのみを使用する、非常にシンプルで簡単な char ドライブです。ドライバーをテストするために、次のプログラムを使用しています... 以下は、ユーザー空間プログラムのソースです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <signal.h>
#include <poll.h>
int main(void){
int num;
char *buff;
FILE *fd = fopen("/dev/hi","a+");
num = fprintf(fd,"this is sentence 1 !!");
num = fprintf(fd,"this is sentence 2 !!");
num = fprintf(fd,"this is sentence 3 !!");
num = fprintf(fd,"this is sentence 4 !!");
num = fprintf(fd,"this is sentence 5 !!");
buff = malloc(sizeof(char) * num+1);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
free(buff);
close(fd);
return 0;
}
ここで、ドライバーがどのように機能するかは重要ではありませんが、読み取りメソッドと書き込みメソッドを呼び出す順序は重要です。理想的には、私がコードを書いた順序でドライバが書き込まれ、コードを書いた順序でドライバから読み取られるとよいでしょう。ただし、次のようにコードを記述した場合に気付きました...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <signal.h>
#include <poll.h>
int main(void){
int num;
char *buff;
FILE *fd = fopen("/dev/hi","w");
num = fprintf(fd,"this is sentence 1 !!");
num = fprintf(fd,"this is sentence 2 !!");
num = fprintf(fd,"this is sentence 3 !!");
num = fprintf(fd,"this is sentence 4 !!");
num = fprintf(fd,"this is sentence 5 !!");
close(fd);
fd = fopen("/dev/hi","r");
buff = malloc(sizeof(char) * num+1);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
fread(buff,sizeof(char),num+1,fd);
printf("%s\n",buff);
free(buff);
close(fd);
return 0;
}
fprintf() は、ファイル記述子を閉じたときにのみ書き込み、最悪の場合、デバイスから読み取った後に実行されることに気付きました。もちろん、私は自分のデバイスに書き込んでから読みたいと思っていますが、そのためには起こりません。これは、ユーザー空間の多くのことが同時に実行されているという印象を与え、私を困惑させます. ユーザー空間を処理するときにデバイス関数が呼び出される順序を知るにはどうすればよいですか? これが漠然としているように思われる場合は申し訳ありません。
返信ありがとうございます。