私はフォークの簡単なコードを見ていて、自分で試してみることにしました。私はコンパイルしてEmacsの中から実行し、Bashで実行したときの出力とは異なる出力を得ました。出力をパイプするときに私のフォークプログラムの出力が異なるのはなぜですか?
#include <unistd.h>
#include <stdio.h>
int main() {
if (fork() != 0) {
printf("%d: X\n", getpid());
}
if (fork() != 0) {
printf("%d: Y\n", getpid());
}
printf("%d: Z\n", getpid());
}
私はgccで、それをコンパイルして、a.outのEmacsの内部から走っただけでなく、cat
、およびgrep .
に配管し、これを得ました。
2055:X
2055:Y
2055:Z
2055:X
2058:Z
2057:Y
2057:Z
2059:Z
これは正しくありません。ただバッシュからそれを実行している私が
2084(私が予想する)を得る:X
2084:Y
2084:Z
2085:Y
2085:Z
2087:Z
2086: Z
編集 - いくつかの改行に
を逃しました何が起こっているのですか?
なぜあなたは何か(特に "cat"は何もしません)を介して結果をパイプしていますか? - オハイオ州、それは奇妙なことを紹介する配管です...うーん... – Pointy
私はこれを再現することができますので、宇宙線や何かではありません。興味をそそる。前者の出力には1つのPID(2056)がないことに注意してください。おそらく 'cat'のPIDです。 – Thomas
私はそれを数回実行しましたが、そのほとんどに欠落しているPIDはありませんでした。 – Squidly