Saya menggunakan PHP dan pcntl_fork (). Idenya adalah bahwa orang tua memotong dan berhenti untuk menyelesaikan anak; anak melakukan tugas kemudian berakhir; orang tua dapat memeriksa kode pengembalian untuk tugas atau status proses anak dan melanjutkan sesuai itu.
(Tugas diisolasi dari induk utama dengan forking, untuk memastikan orang tua dapat membersihkan dengan baik jika tugas tersebut mengenai masalah runtime yang tidak dapat diperbaiki, seperti file "termasuk" yang rusak atau pustaka kunci yang hilang, maka dari fork, pada dasarnya saya mengimplementasikan isolasi proses sederhana untuk kejadian yang mudah-mudahan jarang terjadi, kondisi yang tidak dapat diperbaiki dapat menyebabkan masalah)
Jadi masalahnya adalah bahwa setelah pcntl_fork () kedua proses berbagi deskriptor I / O STDXXX yang sama, sehingga segera setelah anak menyelesaikan tugasnya, I / O yang digunakan tertutup seperti biasa, dan mereka ditutup untuk orangtua sebagai baik, artinya hal-hal seperti echo () yang digunakan untuk melanjutkan interaksi oleh orang tua, tiba-tiba berhenti bekerja juga.
Saya mengikuti tip di php.net dan menggunakan posix kill -9 pada anak alih-alih keluar, sehingga anak berakhir tanpa menutup IO yang dibagikan dengan (dan dibutuhkan oleh) induknya, tetapi apakah ada cara yang lebih rapi untuk melakukan ini ?
Terima kasih!
Jawaban:
Sebelum
pcntl_fork()
Anda dapat "dup" file deskriptor file yang diinginkan dengan membuka misalnyaphp://stdout
danphp://stderr
, atauphp://fd/3
. Lihat php protokol .Perhatikan bahwa ketika seorang anak menutup deskriptor file, itu adalah tidak ditutup pada induknya. Setelah garpu proses berbagi sama penunjuk untuk membuka file, tetapi Anda masih dapat menggema dari orang tua setelah anak keluar.
sumber
close()
pada anak tidak mempengaruhi salinan orang tua dari deskriptor file.pcntl_fork()
seharusnya memanggil sistem nyatafork()
yang efektifdup()
pada file yang terbuka.Content-Length:
sundulan dengan jumlah byte yang ditulis anak. Sebagian besar browser akan menghargai panjang ini dan tidak membacanya, bahkan jika php induknya berhasil menulis lebih banyak data.