[so] [Tema2][Win] Eroare la citire POPEN
Adrian Șendroiu
molecula2788 at gmail.com
Wed Mar 27 13:20:20 EET 2019
Ca să faci debugging, testul respectiv rulează programul my_wc.exe
Încearcă să modifici sursa acestui program [1] și să printezi ce
caractere citește de la stdin.
După care poți rula manual: .\_test\bin\test_popen_write.exe
[1] https://github.com/systems-cs-pub-ro/so-assignments/blob/master/2-stdio/checker-win/_test/src/my_wc.c
On Wed, 27 Mar 2019 at 08:11, Rares Folea <raresfolea97 at gmail.com> wrote:
>
> Intradevar, am modificat gresit, imi cer scuze!
>
> Cu cele mentionate mai sus, am reusit sa implementez popen(…, “r”).
> Inca am probleme la popen(…, “w”), la care nu produce rezultatul corect.
> Numarul de apeluri de sistem este corect, dar comunicarea in pipe nu se realizeaza corect.
>
> Am observat insa, ca daca, introduc in fputc un printf “manual”,linia 266, datele se propaga corect prin pipe
> Functionarea este corecta insa doar daca fac printf(“[FPUTC] %c\n”, (unsigned char *) c).
> Daca fac printf(“[FPUTC]\n”) nu mai merge.
>
> De asemenea, nu pare corelat numarul de printfuri.
> Rezultatul este corect si daca folosesc 3 printfuri la rand in functie:
>
> printf(“[FPUTC] %c\n”, (unsigned char *) c)
> printf(“[FPUTC] %c\n”, (unsigned char *) c)
> printf(“[FPUTC] %c\n”, (unsigned char *) c)
>
> Incurc rau de tot handleurile?
>
>
> Multumesc frumos !!!
>
>
> > On 25 Mar 2019, at 22:45, Adrian Șendroiu <molecula2788 at gmail.com> wrote:
> >
> > Nu ai modificat cum trebuie. Eu am zis "cmd /C" (nu \C, argumentele
> > toolurilor de windows se dau cu /) și să pui parametrul între
> > ghilimele (nu apostroafe).
> >
> > De asemenea, modul în care faci wait după process pare suspect.
> > WaitForSingleObject se face pe un HANDLE, mai exact hProcess din
> > structura PROCESS_INFORMATION.
> >
> > On Mon, 25 Mar 2019 at 22:10, Rares Folea <raresfolea97 at gmail.com> wrote:
> >>
> >> In primul rand, multumesc pentru raspuns!
> >>
> >> Am efectuat modificarile, dar acum intampin o problema referitoare la terminarea procesului copil in cazul POPEN cu argumentul “r”, iar in cazul type = “w”, se obtin date incorecte in fisier. Am epuizat toate metodele cunoscute de debugging.
> >>
> >> In cazul POPEN “r”, in terminal mai apare (uneori) mesajul "The process tried to write to a nonexistent pipe.”
> >>
> >>
> >>
> >> Multumesc pentru ajutor!
> >>
> >>
> >>
> >>> On 25 Mar 2019, at 20:30, Adrian Șendroiu <molecula2788 at gmail.com> wrote:
> >>>
> >>> On Mon, 25 Mar 2019 at 16:55, Rares Folea via so <so at cursuri.cs.pub.ro> wrote:
> >>>>
> >>>> Buna ziua!
> >>>>
> >>>> Ma confrunt cu urmatoarea problema:
> >>>> Apelul fread pe un fisier deschis cu POPEN nu reuseste sa citeasca niciodata.
> >>>>
> >>>> In implementare, am creat pipe-ul, am marcat handlerul de citire din pipe(hRead) nemostenibil, am setat bInheritHandle = TRUE,
> >>>> am creat procesul nou si am inchis in procesul parinte handlerul de scriere(hWrite). In acest moment, apelurile Fread din checker
> >>>> nu reusesc sa citeasca.
> >>>>
> >>>> De asemenea, FWRITE desi pare sa execute syscall-urile necesare, nu produce outputul bun.
> >>>>
> >>>> Implementarea se regaseste pe gitlab, in directorul /l3-so-assignments/2-stdio/util/win.
> >>>>
> >>>>
> >>>>
> >>>> Multumesc frumos!
> >>>
> >>> Salut,
> >>>
> >>> La prima vedere par să fie mai multe greșeli:
> >>> - pe windows popen trebuie să execute cmd /C, nu sh -c. De asemenea,
> >>> argumentul lui cmd /C trebuie pus între ghilimele
> >>> - al doilea parametru al lui SetHandleInformation trebuie să fie
> >>> HANDLE_FLAG_INHERIT, nu 0.
> >>
>
More information about the so
mailing list