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

Emilia Pana emilia.pana at gmail.com
Sat Mar 27 10:03:17 EET 2010


Cred ca trebuie sa setezi handle-ul w sa nu fie mostenibil. Chiar daca tu nu
specifici direct ca e STDOUT in consumator, deoarece CreateProcess are setat
TRUE la mostenirea descriptorilor, el mostenseste si w din parinte, dar nu
mai poate sa il inchida.

Mie mi au fost utile linkurile din laborator care trateaza chestia asta:
http://msdn.microsoft.com/en-us/library/ms724935(VS.85).aspx
<http://msdn.microsoft.com/en-us/library/ms724935(VS.85).aspx>si
http://msdn.microsoft.com/en-us/library/aa365782(VS.85).aspx

<http://msdn.microsoft.com/en-us/library/aa365782(VS.85).aspx>Sper sa te
ajute,
Emilia.

2010/3/27 Alexandru Sutii <sasha_sutii at yahoo.com>

> 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;
> }
>
>
>
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/lurker/list/so.html/attachments/20100327/67961522/attachment-0001.htm>


More information about the so mailing list