Usando _pipe () para a comunicação entre processos

votos
0

Por causa da simplicidade (como eu estou tentando implementar um programa Unix no Windows) Estou querendo usar _pipe(), _write()e _read()para a comunicação entre processos. No Unix, eu posso conseguir isso chamando pipe()antes que eu fork.

Eu tentei implementar isso com processos no Windows. Eu estou chamando _pipe()e depois passando a gravação pipefdinteiro para o novo processo. No entanto quando tento usá-lo ou fechá-lo dentro do processo de criança eu recebo Debug Assertion Failed!desde que eu assuma, para o processo filho, é apenas um inteiro ou algo assim.

Aqui está um trecho de minha principal função dentro do processo pai.

    //...

    // Create pipe file descriptors for parent and child
    ret = _pipe(mypipefd, 256, O_BINARY);
    if (ret == -1) {
        error(Error creating pipe file descriptors);
    }

    // Read request from standard input
    printf(Enter a message: );
    memset(out_buffer, 0, BUFFER_SIZE);
    fgets(out_buffer, BUFFER_SIZE, stdin);
    out_buffer[strcspn(out_buffer, \r\n)] = 0;

    // Create command line arguments for child process
    snprintf(child_cmd, CMD_LINE_SIZE, %s %d \%s\, argv[2], mypipefd[1], out_buffer);

    // Create child process to handle request
    if ( !CreateProcess(
         C:\\Users\\Owner\\VisualStudio\\2803ICT_A1\\2803ICT_A1\\Debug\\Child_Client_WIN32.exe,        // No module name (use command line)
         child_cmd,      // Command line
         NULL,           // Process handle not inheritable
         NULL,           // Thread handle not inheritable
         FALSE,          // Set handle inheritance to FALSE
         0,              // No creation flags
         NULL,           // Use parent's environment block
         NULL,           // Use parent's starting directory
         &si,            // Pointer to STARTUPINFO structure
         &pi)            // Pointer to PROCESS_INFORMATION structure
         )
    {
        printf(CreateProcess failed : %d\n, GetLastError());
        exit(-1);
    }

    // Close child pipe
    _close(mypipefd[1]);

    //...

Como eu iria fazer isso? Se eu não posso com _pipe()o que é um trabalho fácil ao redor?

Publicado 02/09/2018 em 05:06
fonte usuário
Em outras línguas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more