如何證明無效的 PID 假設?

如何證明無效的 PID 假設?

看來很多程式設計師都很滿意將 PID 儲存到檔案中,然後讀取並使用 PID,就好像保證是同一個進程一樣。似乎普遍的想法是,這種可能性足以忽略。我怎麼能簡單地演示這個問題?理想情況下,可以採用現有的 shell 腳本來以最少的嘗試和錯誤來示範這一點。

虛擬範例:

foo &
pid=$!
echo $pid > pidfile
do
    kill $!
    sleep 1 &
until [ $pid -eq $! ]
kill "$(cat pidfile)" # Kills `sleep`, not `foo`!

答案1

usingexec是 PID 重用的一個很好的示範:

#!/bin/bash

cat > foo << 'EOF'
echo "Inside foo."
sleep 5
exec ./bar
EOF

cat > bar << 'EOF'
#!/bin/bash

echo "Inside bar."
sleep 5
EOF

chmod a+x foo bar

./foo &

while sleep 3; do
    [[ -f "/proc/$!/cmdline" ]] || break
    printf 'pid %d == %s\n' "$!" "$(tr '\0' ' ' < "/proc/$!/cmdline")"
done

rm foo bar

執行此腳本會產生類似以下內容的結果:

$ ./script
Inside foo.
pid 4953 == /bin/bash ./script
Inside bar.
pid 4953 == /bin/bash /tmp/tmp.AvDLtMWYPy/bar
pid 4953 == /bin/bash /tmp/tmp.AvDLtMWYPy/bar

您可以exec任意編程,因此無法保證(根本)該 PID 處的進程是相同的,甚至是相似的。

相關內容