Ubuntu 14.04.1 LTSでデバイスドライバをプログラミングしているときに奇妙な動作が発生しました。
sudo insmod hello.ko whom="$"
予想される出力を生成します。
こんにちは$(0)!!!
しかし、sudo insmod hello.ko whom="$$"
以下を生成します。
こんにちは3275(0)!!!
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
MODULE_LICENSE("Dual BSD/GPL");
static char *whom = "world";
static int howMany = 1;
static int __init hello_init(void){
int i;
for(i = 0; i < howMany; i++){
printk(KERN_ALERT "Hello %s (%d) !!!\n", whom, i);
}
return 0;
}
static void __exit hello_exit(void){
printk(KERN_ALERT "Bye bye %s !!!\n", whom);
}
module_init(hello_init);
module_exit(hello_exit);
module_param(howMany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
答え1
カーネルとは関係がなく、単に$$
シェルのプロセスIDに拡張されます。バッシュマニュアル。
($$) はシェルのプロセス ID に展開されます。 ()サブシェルでは、サブシェルではなく呼び出しシェルのプロセスIDに展開されます。
バックスラッシュを使用してドル記号をエスケープするか、単一引用符を使用して拡張を防止します。
$ echo "$$" "\$$" '$$'
29058 $$ $$