Aracılığıyla paylaş


_cwait

Başka bir işlem sonlandırana kadar bekler.

Önemli

Bu API, Windows Çalışma Zamanı yürütülen uygulamalarda kullanılamaz. Daha fazla bilgi için bkz. Evrensel Windows Platformu uygulamalarında desteklenmeyen CRT işlevleri.

Sözdizimi

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

Parametreler

termstat
Belirtilen işlemin sonuç kodunun depolanacağı arabelleğe işaret eden veya NULL.

procHandle
Beklenme işleminin tanıtıcısı (yani, daha önce _cwait sonlandırması gereken işlem geri dönebilir).

action
NULL: Windows işletim sistemi uygulamaları tarafından yoksayılır; diğer uygulamalar için: üzerinde procHandlegerçekleştirilecek eylem kodu.

Dönüş değeri

Belirtilen işlem başarıyla tamamlandığında, belirtilen işlemin tutamacını döndürür ve belirtilen işlem tarafından döndürülen sonuç koduna ayarlar termstat . Aksi takdirde, -1 döndürür ve aşağıdaki gibi ayarlar errno .

errno Değer Tanım
ECHILD Belirtilen işlem yok, procHandle geçersiz veya veya WaitForSingleObject API çağrısı GetExitCodeProcess başarısız oldu.
EINVAL action geçersizdir.

Bunlar ve diğer iade kodları hakkında daha fazla bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.

Açıklamalar

işlevi, _cwait tarafından procHandlesağlanan belirtilen işlemin işlem kimliğinin sonlandırılmasına bekler. geçirilen değeri procHandle_cwait , belirtilen işlemi oluşturan işlev çağrısı _spawn tarafından döndürülen değer olmalıdır. İşlem kimliği çağrılmadan önce _cwait sonlandırılırsa, _cwait hemen döndürür. _cwait geçerli bir tanıtıcının (procHandle) bulunduğu bilinen diğer işlemleri beklemek için herhangi bir işlem tarafından kullanılabilir.

termstat belirtilen işlemin dönüş kodunun depolanacağı arabelleğe işaret eder. değeri termstat , belirtilen işlemin Windows ExitProcess API'sini çağırarak normal şekilde sonlandırılıp sonlandırılmadığını gösterir. ExitProcess , veya exit_exitçağrısında bulunursa dahili olarak çağrılır veya öğesinin içinden maindöndürür veya sonuna mainulaşır. üzerinden termstatgeri geçirilen değer hakkında daha fazla bilgi için bkz GetExitCodeProcess. . için termstatbir NULL değer kullanılarak çağrılırsa_cwait, belirtilen işlemin dönüş kodu depolanmaz.

Üst-alt action ilişkiler bu ortamlarda uygulanmadığından, parametre Windows işletim sistemi tarafından yoksayılır.

-1 veya -2 değilse procHandle (geçerli işlem veya iş parçacığının tanıtıcıları), tanıtıcı kapatılır. Bu durumda, döndürülen tanıtıcıyı kullanmayın.

Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.

Gereksinimler

Yordam Gerekli başlık İsteğe bağlı üst bilgi
_cwait <process.h> <errno.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

// 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]);
    }
}

Çıktının sırası çalıştırmadan çalıştırmaya göre değişir.

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.

Ayrıca bkz.

İşlem ve ortam denetimi
_spawn, _wspawn işlevler