Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Familia de funcții exec
Last Updated: May 08 2015 08:45, Started by
worm94
, May 06 2015 20:27
·
0
#1
Posted 06 May 2015 - 20:27
Salut din nou,
Am si eu o bătaie de cap cu funcțiile din familia exec. De exemplu, execl, despre care manualul spune că ar trebui să arate cam așa: int execl(const char *path, const char *arg, ...) Am făcut progrămelul următor : #include "hdr.h" #include <stdio.h> int main(void) { int p[2]; int pid; if (pipe(p) == -1) err_sys("Nu s-a putut crea pipe-ul"); if ((pid = fork()) == 0) { if (close(p[1]) < 0) err_sys("Eroare close write fiu"); if (close(0) < 0) err_sys("Eroare close stdin fiu"); if (dup(p[0]) < 0) err_sys("Eroare dup fiu"); if (close(p[0]) < 0) err_sys("Eroare close read nefolosit fiu"); execl("/bin/cat", "/bin/cat", NULL); } else { if (close(p[0]) < 0) err_sys("Eroare close read parinte"); int i = 0; char *msg = "My name is Bond, James Bond."; while (msg[i] != '\0') { write(p[1], &msg[i], 1); i++; } if (close(p[1]) < 0) err_sys("Eroare close write parinte"); } return 0; } Și am observat că funcționează la fel dacă scriu : execl("/bin/cat","p[0]" ,NULL); sau execl("/bin/cat","/bin/cat" ,NULL); //varianta gasită pe net După cum este prototipul funcției nu ar trebui să i se dea calea și argumentul, în cazul de față capătul de pipe din care să afișeze cu, cat? Când nu i-l dau de unde știe ce să afișeze? Sau încă un exemplu (nu prea are sens aici exec) : #include <unistd.h> int main(void) { execl("/bin/ls","file.txt",NULL); return 0; } Dacă file.txt există ar trebui să-mi afișeze numele lui pe rândul următor și atat, dar el îmi afișează conținutul folderului. Nu prea ia în considerare argumentul. |
#2
Posted 06 May 2015 - 20:38
Din sfantul manual:
[ https://i.imgur.com/Hai7eSZ.png - Pentru incarcare in pagina (embed) Click aici ] Ce nu e clar din acest text? Nu e o intrebare capcana, e o intrebare la modul cel mai serios. Trebuie sa inveti sa citesti documentatii tehnice, iar clarificarea neclaritatilor te ajuta sa iti insusesti treptat aceasta aptitudine. Deci arata-mi clar care cuvant, secventa de cuvinte, sau fraza e neclar(a). |
#3
Posted 06 May 2015 - 20:49
Acolo zice că argv0 pointează spre numele programului.
Folderul cu progrămelul ls arată așa. test ->main.c ->Debug Eu îl rulez din debug (./test) iar el în program ar trebui să facă ls test și pur și simplu să-mi afișeze numele executabilului. Adică așa înțeleg eu dar e clar că e greșit de vreme ce nu face așa. |
#4
Posted 06 May 2015 - 21:30
Semnatura functiei este asa
[ https://i.imgur.com/vd2kfRq.png - Pentru incarcare in pagina (embed) Click aici ] Tu ai apelul asa: execl("/bin/ls","file.txt",NULL);path este deci "/bin/ls" in codul tau arg0 (care ar trebui sa fie numele fisierului executat, adica "ls"), este la tine ce? Iar dupa, urmeaza NULL, adica sfarsitul argumentelor variadice. Ce afiseaza ls cand il rulezi in consola, fara alti parametri? |
#5
Posted 07 May 2015 - 10:17
Am înțeles ce vrei să spui.
Eu când am văzut cuvantul argumente mi-am imaginat ca prin variabila path selectezi un executabil (de exemplu cat) caruia trebuie să-i dai un argument, să aiba ce executa, respectiv un fișier. După ce înțelesem eu execl("/bin/ls","file.txt",NULL);se simplifica in ls file.txt Dar am înțeles cât de cât ce ai explicat Totuși nu îmi e clar la exemplul de sus cu pipe de unde știe să facă cat asupra lui p[0] dacă nu îi este specificat acest lucru. |
#6
Posted 07 May 2015 - 17:43
Când citești documentația, trebuie să vezi lumea prin prisma termenilor așa cum sunt ei definiți de autorul funcției și al documentației.
Nu cum îți imaginezi tu. Dacă autorul zice "funcția asta e pentru a executa un program, căruia îi poți pasa argumente, și argumentele sunt x și y", atunci trebuie să iei documentația fix ca atare. worm94, on 07 mai 2015 - 10:17, said:
Totuși nu îmi e clar la exemplul de sus cu pipe de unde știe să facă cat asupra lui p[0] dacă nu îi este specificat acest lucru. [ https://i.imgur.com/kUK9HjL.png - Pentru incarcare in pagina (embed) Click aici ] Deci ne uitam la man 2 execve: [ https://i.imgur.com/gUOpsxE.png - Pentru incarcare in pagina (embed) Click aici ] Edited by OriginalCopy, 07 May 2015 - 18:47. |
#7
Posted 08 May 2015 - 08:45
ok, am ințeles ce mi-ai explicat și am înțeles și ideea.
Am sa acord mai multă atenție de acum. Mulțumesc |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users