返されたエラーを知らなければ、言うのは難しいです...私の最初は、ファイル記述子に対するアクセス許可です。私は以前に同様の問題を見たことがあります。まず、ioctlの戻り値を確認すると、失敗に関する詳細情報を取得できます。
#include <errno.h>
int main(int argc, char* argv[])
{
long ret;
int fd = fopen("/dev/aes", "r+");
ret = ioctl(fd, 0, 1);
if (ret < 0)
printf("ioctl failed. Return code: %d, meaning: %s\n", ret, strerror(errno));
fclose(fd);
}
戻り値を確認してください。これは、検索するための何かを提供するのに役立ちます。なぜチェックするのですか?投稿の下部を参照してください...
次に、権限の問題であるかどうかを確認するには、次のコマンドを実行します。
ls -l /dev/aes
次のようなものが表示された場合:
crw------- 1 root root 10, 57 Aug 21 10:24 /dev/aes
次に、次を発行します。
sudo chmod 777 /dev/aes
そして、もう一度試してください。私はそれがあなたのために働くに違いない。(rootは私のバージョンのmodの所有者であるため、root権限で実行したことに注意してください)
権限がすでにOKの場合は、さらにいくつかの提案があります。
1)私にとって、fopen/fcloseの使用は奇妙です。あなたは本当にする必要があるだけです:
int fd = open("/dev/aes");
close(fd);
私のシステムでは、コードをそのままコンパイルすることすらできません。
2)IOCTLパラメータリストが古く、コンパイルするカーネルバージョンがわかりませんが、最近のカーネルは次の形式を使用しています。
long aes_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param){
iノードの削除とリターンタイプの変更に注意してください。システムでコードを実行したときに、これらの変更を加えました。
頑張ってください!
注:「ioctlにアクセスしていない」ときにリターンを確認する必要があるのはなぜですか?例を挙げましょう:
//Kernel Code:
//assume include files, other fops, exit, miscdev struct, etc. are present
long hello_ioctl(struct file *file, unsigned long ioctl_num, unsigned long ioctl_param) {
long ret = 0;
printk("in ioctl");
return ret;
}
static const struct file_operations hello_fops = {
owner: THIS_MODULE,
read: hello_read,
unlocked_ioctl: hello_ioctl,
};
static int __init hello_init(void) {
int ret;
printk("hello!\n");
ret = misc_register(&hello_dev); //assume it worked...
return ret;
}
ユーザースペースコード:
//assume includes
void main() {
int fd;
long ret;
fd = open("/dev/hello");
if(fd) {
c = ioctl(fd, 0, 1);
if (c < 0)
printf("error: %d, errno: %d, meaning: %s\n", c, errno, strerror(errno));
close(fd);
}
return;
}
では、出力は何ですか?/ dev / helloのファイルパーミッションが悪いと仮定しましょう(つまり、ユーザースペースプログラムは/ dev / helloにアクセスできません)。
dmesg | テールショー:
[ 2388.051660] Hello!
したがって、ioctlに「参加」しなかったようです。プログラムからの出力は何ですか?
error: -1, errno: 9, meaning: Bad file descriptor
たくさんの便利な出力。明らかに、ioctl呼び出しは、私たちが望んでいたことではなく、何かを実行しました。権限を変更して再実行すると、新しいdmesgが表示されます。
[ 2388.051660] Hello!
[ 2625.025339] in ioctl