如何证明无效的 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

使用exec是一个很好的 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 处的进程是相同的,甚至是相似的。

相关内容