6

私は疑問を持っています。

カーネルを開き、ディレクトリlinux-3.1.1 / fs/open.cを変更しました

open.cのフォローコードを変更しました。

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
{
    long ret;
    printk(KERN_EMERG "Testing\n");
    ... 
}

私はこの行だけを置きます:printk(KERN_EMERG "Testing");

そして私はライブラリを含めます:<linux/kernel.h>そして<linux/printk.h>

そこで、Linux(Ubuntu)をコンパイルして再起動しました。再起動中に、画面に多くの「テスト」が表示されました。だから今まではOKです。


しかし今、私は問題を抱えています。このプログラムはcで作成しました。

int main()
{
    size_t filedesc = open("testefile2.txt",O_CREAT | O_WRONLY,0640);
    printf("%d",filedesc);
}

私はこのプログラムをコンパイルして実行し、うまく機能しました。しかし、なぜ「テスト」がシェルに表示されなかったのかわかりません。つまり、PCを再起動したときに「テスト中」という単語がたくさん表示された場合、上記のプログラムを実行したときにこの単語が表示されないのはなぜですか。追加するだけで、上記のコードにこのライブラリを含めます。

unistd.h、、、、fcntl.h_ stdio.h_stdlib.h

君たちありがとう。

4

2 に答える 2

6

printk呼び出しは、プロセスのstdout / stderrではなく、カーネルメッセージバッファに表示されます

于 2011-11-19T00:18:02.003 に答える
4

しかし、なぜ「テスト」がシェルに表示されなかったのかわかりません。

これはprintkのメッセージ抑制の効果だと思います。(より正確には:レート制限

メッセージログまたはコンソールで確認してください

printk: ### messages suppressed.

ストリング。

最近メッセージが多かった場合、この機能はメッセージの印刷を停止します。

実際のコードは3.1カーネルです:http://lxr.linux.no/#linux+v3.1.1/kernel/printk.c#L1621

1621 * printk rate limiting, lifted from the networking subsystem.
1622 *
1623 * This enforces a rate limit: not more than 10 kernel messages
1624 * every 5s to make a denial-of-service attack impossible.
1625 */
1626 DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
1627
1628 int __printk_ratelimit(const char *func)

したがって、opensyscallは非常に人気があるため(最も単純なものを開始するだけでstrace -e open /bin/ls15のsyscallを取得します)、レート制限が有効になります。メッセージが5秒間に1回だけ印刷されるように制限されます。1回の「バースト」で10個以下のメッセージ。openls

printk既知のUIDを持つ特別なユーザーを作成し、追加のprintk-in-openコードでUIDチェックを追加することを提案することしかできません。

于 2011-11-18T23:59:45.743 に答える