[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