[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