誰かが疑問に思うならなど。
これをもう一度見直すことにしました-そして少し進歩しました。
組み込みオプションを使用すると、--save-config
次の重要なプロパティがあります。
Role=gnome-terminal-window-2587-1856448950-1359348087
ActiveTerminal=Terminal0xa896200
Geometry=110x87+900+1
WorkingDirectory=/home/xxx/tmp
よく見てください。短い連続で2つのウィンドウを開き、を実行しましたsave-config
。
役割
さまざまな部分に分割できます。
gnome-terminal-window
2587
1856448950
1359348087
PID
2587
どちらも同じであり、簡単pstree 2587 -p
に説明すると、それがPIDであることがわかります。さらに、echo $$
私たちのbash(またはどちらかが好きな方)を見つけます。
開始時間
ここで、2番目の数値は大きく異なり、おそらくランダムな値であることがわかります。最後の1つ、thoは、diffの最後の桁のみです。おそらくタイムスタンプです。私はこのtmp
ウィンドウのディレクトリにいることを知っています-したがって、procファイルシステムの知識を使用することによって:
# btime: boot time, in seconds since the Epoch
$ cat /proc/stat | grep ^btime | cut -d' ' -f2
1359039155
# starttime: The time in jiffies the process started after system boot.
$ cat /proc/$$/stat | cut -d' ' -f22
30893222
# WANT: 1359348087
btime + starttime / Hertz
1359039155 + (30893222 / 100) = 1359348087.22 ~ 1359348087
わかった。最後の桁は、エポックによる開始時のタイムスタンプです。しかし、残念ながら、それはjiffiesと丸められた値によるものではないため、たとえばスクリプトによって複数のウィンドウを開始した場合、同じ値になる可能性があります。
(いくつかのチェックの後、秒はゼロに向かってではなく、最も近いものに丸められているようにも見えます。)
ランダム値
わかった。では、PIDの後の値はどうですか?おそらくランダムな値ですが、確かに。これを確認するには、ソースに移動する必要があります。
$ git clone git://git.gnome.org/gnome-terminal
$ gnome-terminal --version
GNOME Terminal 3.6.0
$ git log --grep="3\.6\.0"
commit f4d291a90dc4f513fc15f80fdebcdc3c3349b70a
...
Version 3.6.0
$ git checkout f4d291a90dc4f513fc15f80fdebcdc3c3349b70a
いくつか掘り下げた後、私たちは見つけます:
# terminal-util.c
48: void
terminal_util_set_unique_role (GtkWindow *window, const char *prefix)
{
char *role;
role = g_strdup_printf(
"%s-%d-%d-%d",
prefix,
getpid(),
g_random_int(),
(int) time (NULL)
);
gtk_window_set_role (window, role);
g_free (role);
}
わかった。2番目がランダムな値であることを確認するだけでなく、PIと時間が正しいことも確認します。
ジオメトリ
xwininfo -id $(xdotool getactivewindow) | \
grep '^\s*-geometry' | \
sed 's/^\s*[^ ]* \(.*\)/\1/'
# yields 110x87+900+1
わかった。これで、チェックする値が3つあります。
問題は、これでも、同じ値の値を持つ2つのウィンドウを簡単に作成できることです。そしてもっと重要です。一部の天才は、これをアプリケーションのオプションから削除することを決定しました。
ターミナルウィンドウヘックス
コードをさらに見ると、etcなどの16進値ActiveTerminal
は、現在のウィンドウを保持している構造体のメモリ内の現在のアドレスへのポインタ値であることがわかります。メモリマッピングをハックしたくない場合は、AKAはあまり役に立ちません。