Dalam Buku "Pemrograman Lanjutan di Lingkungan Unix", bagian tunggu dan tunggu berkata:

fungsi waitpid tidak menunggu anak yang berakhir terlebih dahulu; ia memiliki sejumlah opsi yang mengontrol proses mana yang menunggu.

Saya membaca ini seolah-olah proses anak keluar terlebih dahulu dan proses induk belum memanggil fungsi waitpid, proses anak tidak akan menunggu dan akan tetap sebagai proses zombie setelah berhenti.

Jadi saya menulis beberapa kode untuk menguji:

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // child process
        printf("Child Process ID: %d \n", getpid());
        printf("Child Process Quit\n");
        exit(0);
    } else {
        // parent 
        sleep(5);
        printf("Parent Process ID: %d \n", getpid());
        printf("Wait child %d ...\n", pid);
        int status;
        waitpid(pid, &status, 0);
        printf("waitpid called\n");
        sleep(5);
    }
    return 0;
}

Program pertama-tama mencetak "Child Process ID" dan "Child Process Quit", saat proses induk masih tidur, di jendela terminal lain, jika saya menggunakan ps -el | grep 'Z', saya dapat melihat proses anak ini adalah <defunct> (zombie).

Kemudian 5 detik kemudian, selama proses induk disebut waitpid, di jendela terminal lain, gunakan ps -el | grep 'Z' tidak akan menampilkan proses anak zombie lagi, jadi itu berarti proses anak telah menunggu dan bukan zombie lagi.

Jadi sepertinya proses induk selalu bisa menunggu proses anak dengan waitpid, jadi bagaimana saya menafsirkan "fungsi waitpid ini tidak menunggu anak yang berakhir terlebih dahulu"?

1
Bo Tinker 29 Maret 2020, 03:20

1 menjawab

Jawaban Terbaik

Jika Anda melengkapi kutipan (seperti yang sekarang diselesaikan dalam pertanyaan), Anda akan melihat bahwa waitpid() lebih fleksibel (daripada wait()).

Spesifikasi POSIX mengatakan:

Argumen pid menentukan serangkaian proses anak yang statusnya diminta. Fungsi waitpid() hanya akan mengembalikan status proses anak dari set ini:

  • Jika pid sama dengan (pid_t)-1, status diminta untuk setiap proses turunan. Dalam hal ini, waitpid() kemudian setara dengan wait().

  • Jika pid lebih besar dari 0, ini menentukan ID proses dari proses anak tunggal yang statusnya diminta.

  • Jika pid adalah 0, status diminta untuk setiap proses turunan yang ID grup prosesnya sama dengan proses pemanggilan.

  • Jika pid kurang dari (pid_t)-1, status diminta untuk setiap proses anak yang ID grup prosesnya sama dengan nilai absolut pid.

Jadi, seperti kata kutipan, waitpid() tidak selalu (hanya) menunggu anak pertama meninggal; Anda dapat memilih dengan lebih tepat anak atau anak mana yang Anda minati. Selain itu, Anda memiliki opsi seperti WNOHANG yang berarti bahwa fungsi akan kembali jika tidak ada anak yang meninggal yang memenuhi kriteria (tetapi setidaknya ada satu proses yang akan memenuhi kriteria). Anda mendapatkan status yang berbeda jika tidak ada anak yang memenuhi kriteria.

0
Community 20 Juni 2020, 09:12