[so] [Tema1][Windows]Problema noua pipe

Alexandru Sutii sasha_sutii at yahoo.com
Sat Mar 27 09:47:21 EET 2010


Nu redirectionez hWrite si la consumator. Multumesc pentru sfat.

Mi-am creat un mic program de tesc care ruleaza "ls | grep txt" ca sa exemplific cum fac in tema pipe-ul. Am incercat sa inchid capetele pipe-ului si inainte de primul wait, si inainte de al doilea.

 Precizez ca testele le fac pe masina virtuala de pe site folosind cygwin. Compilez cu cl din Visual Studio.

Mai jos este codul programelului meu cu "ls | grep txt". As aprecia daca mi-ar spune cineva unde gresesc. 

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

int main()
{
    HANDLE r, w;
    SECURITY_ATTRIBUTES sa;
    PROCESS_INFORMATION pi_c;
    STARTUPINFO si_c;

    PROCESS_INFORMATION pi_p;
    STARTUPINFO si_p;
    BOOL bRes;
    
    // Setez informatiile pentru consumator
    ZeroMemory(&sa, sizeof(sa));

    sa.bInheritHandle = TRUE;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;

    // Creez pipe-ul
    if (!CreatePipe(&r, &w, &sa, 0))
        printf("nu am putut crea pipe-ul\n");

    // Setez parametrii pentru consumator
    ZeroMemory(&si_c, sizeof(si_c));

    si_c.cb = sizeof(si_c);

    si_c.hStdInput = r;
    si_c.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    si_c.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    si_c.dwFlags = STARTF_USESTDHANDLES;

    ZeroMemory(&pi_c, sizeof(pi_c));
    
    // Creez consumatorul
    bRes = CreateProcess(NULL, "grep txt", NULL, NULL, TRUE,
        NORMAL_PRIORITY_CLASS, NULL, NULL, &si_c, &pi_c);

    if (!bRes)
        printf("Eroare la crearea consumatorului\n");

    // Setez parametrii pentru producator
    ZeroMemory(&si_p, sizeof(si_p));

    si_p.cb = sizeof(si_p);

    si_p.hStdOutput = w;
    si_p.hStdInput = GetStdHandle(STD_OUTPUT_HANDLE);
    si_p.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    si_p.dwFlags = STARTF_USESTDHANDLES;

    ZeroMemory(&pi_p, sizeof(pi_p));
    
    // Creez producatorul
    bRes = CreateProcess(NULL, "ls", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,
                        NULL, NULL, &si_p, &pi_p);

    if (!bRes)
        printf("Eroare la crearea producatorului\n");
    
    // Astept sa se termine producatorului
    if (WaitForSingleObject(pi_p.hProcess, INFINITE))
        printf("Eroare la asteptarea consumatorului\n");;

    // Inchid procesul producator
    CloseHandle(pi_p.hProcess);
    CloseHandle(pi_p.hThread);

    // Inchid capatul de scriere a pipe-ului
    CloseHandle(w);

    printf("Inainte de asteptarea consumatorului\n");
    fflush(stdout);

    // Astept sa se termine consumatorul
    if (!WaitForSingleObject(pi_c.hProcess, INFINITE))
        printf("Eroare la asteptarea consumatorului\n");;

    // AICI NU AJUNGE NICIODATA PENTRU CA SE BLOCHEAZA LA WAIT

    printf("S-a terminat consumatorul\n");
    fflush(stdout);

    // Inchid capatul de citire
    CloseHandle(r);
    
    return 0;
}


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/lurker/list/so.html/attachments/20100327/78a366e5/attachment.htm>


More information about the so mailing list