唯一の入力パラメーターとしてファイル名(ファイルへのパス)を指定して、Linuxカーネル3.5でファイルの内容を完全に0または1に消去するにはどうすればよいですか?
unlinkシステムコールの構造と、多くのチェックコールの後で調べましたint vfs_unlink(struct inode *dir, struct dentry *dentry)
* dentryからファイルの内容を削除するにはどうすればよいですか?それとも私*dentry
はまったく使うべきですか?
編集
答えに応えて:私はただデータを上書きしたいだけです。そして、私は完璧な結果を探していません。私はこれまでに進歩しました:
一方:vfs_unlinkを使用する
私は次のコードで混乱しています:
error = security_inode_unlink(dir, dentry);
if (!error) {
error = dir->i_op->unlink(dir, dentry);
if (!error)
dont_mount(dentry)
}
ここで実際のリンク解除はどこで行われていますか?
別のアプローチ:writeシステムコールを使用してデータの書き込みを進めました。
私は特にこれらの行を理解できませんでした:
143 int size = file->f_path.dentry->d_inode->i_size;
144 loff_t offs = *off;
145 int count = min_t(size_t, bytes, PAGE_SIZE);
151 if (size) {
152 if (offs > size)
153 return 0;
154 if (offs + count > size)
155 count = size - offs;
156 }
157
158 temp = memdup_user(userbuf, count);
162 mutex_lock(&bb->mutex);
163
164 memcpy(bb->buffer, temp, count);
165
166 count = flush_write(file, bb->buffer, offs, count);
167 mutex_unlock(&bb->mutex);
168
169 if (count > 0)
170 *off = offs + count;
171
172 kfree(temp);
173 return count;
誰かが私にこれを説明できますか?ファイルにnullを書き込むことができるようにします。私の関数は次のようになります。
static void write(struct file *file)
これについて助けが必要です。私はコードを求めていませんが、現在迷っています。
ありがとう
PS:私はユーザーレベルのプログラムでこの非常に単純なことを行う方法を完全によく知っています。しかし、それは私の仕事ではありません。私はカーネル空間でそれをしなければなりません。そして、私はそれについて助けが必要です(そして、特にカーネルプログラミングに慣れていないのでコードを理解する必要があります)。