[pso] [Tema1 linux] Problema current
Bogdan Nitu
nitubogdan_cc at yahoo.com
Sat Mar 20 18:02:38 EET 2010
Greseala mea. Testam dmeg | tail si vedeam doar printk-urile facute de minedoar pentru un apel - eu il vedeam doar pe ultimul (in total se apela handlerul de 14 ori pentru un singur apel de sistem - si primulma interesa pe mine ). Pentru toate testele precedente se apela handler-ul meuo singura data, dar aici de 14 ori (si copiii). Si din cele 14 eu ma uitam la ultimul si de aceea nu mergea current. ( current->parent->parent vrea).
Testul nu trecea si din cauza testerului, trebuia scos decat carecterul '^'. Varianta care a mers la mine este asta: sprintf(dummy, "dmesg | grep '\\[%lx\\]%lx(%lx,%lx,%lx,%lx,%lx,%lx)=%lx' &> /dev/null", (long)getpid(), sno, args[0],args[1], args[2], args[3], args[4], args[5], ret);Multumesc frumos pentru raspuns si ajutor!
Bogdan!
--- On Sat, 3/20/10, Octavian Voicu <octavian.voicu at gmail.com> wrote:
From: Octavian Voicu <octavian.voicu at gmail.com>
Subject: Re: [pso] [Tema1 linux] Problema current
To: "Proiectarea Sistemelor de Operare" <pso at cursuri.cs.pub.ro>
Date: Saturday, March 20, 2010, 5:47 PM
2010/3/20 Bogdan Nitu <nitubogdan_cc at yahoo.com>
Current nu intoarce ce trebuie cand nobody isi face copil.
Eu o am o problema cu testul de la monitor. In functia ret=msyscall(sno, args) se face apel de sistem si apoi se apeleaza system pentru 'dmesg | grep .....' (pentru testare). Cand se face apelul msyscall(sno, args) la mine in modul campurile comm si pid din current nu sunt 'test' si pid-ul corespunzator, ci 'grep' si alt pid in schimb. Daca in loc de system in fisierul de testare fac fork la fel se intampla, modulul imi vede in current nu procesul curent, ci pe cel al copilului sau (dmesg | grep ....). Daca nu se face system in test (sau fork), current este ok in modul. Nu inteleg. Pana la testul cu do_monitor trec testele, nu vad vreo greseala in modul (current nu intoarce ce trebuie cand nobody isi face copil).
Comanda system("dmesg | grep ...") porneste in total 3 procese. Primul este shell-ul care primeste intr-un parametru comanda de executat, "dmesg | grep". Apoi desparte comanda asta in doua bucati si porneste 2 noi procese, dmesg si grep, legandu-le printr-un pipe.
Totusi, syscall-ul in sine, msyscall, este executat doar de procesul parinte (deci relativ la procesul cu comm == "grep", current->parent->parent->pid este pid-ul care va executa syscall-ul). Daca iei syscall-ul open, el e folosit de multe ori pt fiecare rulare de comanda (trebuie sa deschide binarul aplicatiei + toate librariile si alte fisiere, vezi "strace grep" de exemplu).
Asa cum am mai spus intr-un mesaj, testeaza cu un syscall care nu e asa folosit -- de exemplu getgid, uname.
Octavian
-----Inline Attachment Follows-----
_______________________________________________
pso mailing list
pso at cursuri.cs.pub.ro
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20100320/bb998fab/attachment.htm>
More information about the pso
mailing list