Share via


_cwait

Menunggu hingga proses lain berakhir.

Penting

API ini tidak dapat digunakan dalam aplikasi yang dijalankan di Windows Runtime. Untuk informasi selengkapnya, lihat Fungsi CRT yang tidak didukung di aplikasi Platform Windows Universal.

Sintaks

intptr_t _cwait(
   int *termstat,
   intptr_t procHandle,
   int action
);

Parameter

termstat
Penunjuk ke buffer tempat kode hasil proses yang ditentukan akan disimpan, atau NULL.

procHandle
Handel ke proses untuk menunggu (yaitu, proses yang harus dihentikan sebelum _cwait dapat kembali).

action
NULL: Diabaikan oleh aplikasi sistem operasi Windows; untuk aplikasi lain: kode tindakan untuk dilakukan pada procHandle.

Nilai hasil

Ketika proses yang ditentukan telah berhasil diselesaikan, mengembalikan handel proses dan set termstat yang ditentukan ke kode hasil yang dikembalikan oleh proses yang ditentukan. Jika tidak, mengembalikan -1 dan set errno sebagai berikut.

errno nilai Deskripsi
ECHILD Tidak ada proses yang ditentukan, procHandle tidak valid, atau panggilan ke GetExitCodeProcess API atau WaitForSingleObject gagal.
EINVAL action tidak valid.

Untuk informasi selengkapnya tentang kode pengembalian ini dan lainnya, lihat errno, , _doserrno_sys_errlist, dan _sys_nerr.

Keterangan

Fungsi _cwait menunggu penghentian ID proses dari proses yang ditentukan yang disediakan oleh procHandle. Nilai procHandle yang diteruskan menjadi _cwait nilai yang dikembalikan oleh panggilan ke _spawn fungsi yang membuat proses yang ditentukan. Jika ID proses berakhir sebelum _cwait dipanggil, _cwait segera dikembalikan. _cwait dapat digunakan oleh proses apa pun untuk menunggu proses lain yang diketahui di mana handel yang valid (procHandle) ada.

termstat menunjuk ke buffer tempat kode pengembalian proses yang ditentukan akan disimpan. Nilai termstat menunjukkan apakah proses yang ditentukan dihentikan secara normal dengan memanggil Windows ExitProcess API. ExitProcessdipanggil secara internal jika proses yang ditentukan memanggil exit atau _exit, mengembalikan dari main, atau mencapai akhir .main Untuk informasi selengkapnya tentang nilai yang diteruskan kembali termstat, lihat GetExitCodeProcess. Jika _cwait dipanggil dengan menggunakan NULL nilai untuk termstat, kode pengembalian dari proses yang ditentukan tidak disimpan.

Parameter action diabaikan oleh sistem operasi Windows karena hubungan induk-anak tidak diterapkan di lingkungan ini.

Kecuali procHandle -1 atau -2 (menangani proses atau utas saat ini), handel akan ditutup. Dalam situasi ini, jangan gunakan handel yang dikembalikan.

Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.

Persyaratan

Rutin Header yang diperlukan Header opsional
_cwait <process.h> <errno.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

// crt_cwait.c
// compile with: /c
// This program launches several processes and waits
// for a specified process to finish.

#define _CRT_RAND_S

#include <windows.h>
#include <process.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

// Macro to get a random integer within a specified range
#define getrandom( min, max ) (( (rand_s (&number), number) % (int)((( max ) + 1 ) - ( min ))) + ( min ))

struct PROCESS
{
    intptr_t hProcess;
    char    name[40];
} process[4] = { { 0, "Ann" }, { 0, "Beth" }, { 0, "Carl" }, { 0, "Dave" } };

int main(int argc, char* argv[])
{
    int termstat, c;
    unsigned int number;

    srand((unsigned)time(NULL));    // Seed randomizer

    // If no arguments, this is the calling process
    if (argc == 1)
    {
        // Spawn processes in numeric order
        for (c = 0; c < 4; c++) {
            _flushall();
            process[c].hProcess = _spawnl(_P_NOWAIT, argv[0], argv[0],
                process[c].name, NULL);
        }

        // Wait for randomly specified process, and respond when done
        c = getrandom(0, 3);
        printf("Come here, %s.\n", process[c].name);
        _cwait(&termstat, process[c].hProcess, _WAIT_CHILD);
        printf("Thank you, %s.\n", process[c].name);

    }
    // If there are arguments, this must be a spawned process
    else
    {
        // Delay for a period that's determined by process number
        Sleep((argv[1][0] - 'A' + 1) * 1000L);
        printf("Hi, Dad. It's %s.\n", argv[1]);
    }
}

Urutan output bervariasi dari eksekusi untuk dijalankan.

Hi, Dad. It's Ann.
Come here, Ann.
Thank you, Ann.
Hi, Dad. It's Beth.
Hi, Dad. It's Carl.
Hi, Dad. It's Dave.

Baca juga

Kontrol proses dan lingkungan
_spawn, _wspawn fungsi