system(3) Library Functions Manual system(3) NUME sistem - executa o comanda shell BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include int system(const char *comanda); DESCRIERE Funcia de biblioteca system() se comporta ca i cum ar fi utilizat fork(2) pentru a crea un proces-copil care sa execute comanda shell specificata in comanda utilizand execl(3) dupa cum urmeaza: execl("/bin/sh", "sh", "-c", comanda, (char *) NULL); system() returneaza dupa ce comanda a fost finalizata. In timpul executarii comenzii, SIGCHLD va fi blocat, iar SIGINT i SIGQUIT vor fi ignorate, in procesul care apeleaza system(); (aceste semnale vor fi tratate in conformitate cu valorile lor implicite in interiorul procesului-copil care executa comanda). Daca comanda este NULL, atunci system() returneaza o stare care indica daca un shell este disponibil pe sistem. VALOAREA RETURNATA Valoarea returnata de system() este una dintre urmatoarele: o Daca comanda este NULL, atunci o valoare diferita de zero daca este disponibil un shell, sau 0 daca nu este disponibil niciun shell. o Daca un proces-copil nu a putut fi creat sau starea acestuia nu a putut fi recuperata, valoarea de returnare este -1 i errno este configurata pentru a indica eroarea. o In cazul in care un shell nu a putut fi executat in procesul-copil, atunci valoarea de returnare este ca i cum shell-ul copil s-ar fi incheiat prin apelarea _exit(2) cu starea 127. o Daca toate apelurile sistemului reuesc, atunci valoarea de returnare este starea de terminare a shell-ului copil utilizat pentru a executa comanda; (starea de terminare a unui shell este starea de terminare a ultimei comenzi pe care o executa). In ultimele doua cazuri, valoarea de returnare este o ,,stare de ateptare" care poate fi examinata utilizand macrocomenzile descrise in waitpid(2); (i anume, WIFEXITED(), WEXITSTATUS() i aa mai departe). system() nu afecteaza starea de ateptare a niciunui alt copil. ERORI-IEIRE system() poate eua cu oricare dintre aceleai erori ca fork(2). ATRIBUTE Pentru o explicaie a termenilor folosii in aceasta seciune, a se vedea attributes(7). +--------------------------------------+---------------------+---------+ |Interfaa | Atribut | Valoare | +--------------------------------------+---------------------+---------+ |system() | Sigurana firelor | MT-Safe | +--------------------------------------+---------------------+---------+ STANDARDE C11, POSIX.1-2008. ISTORIC POSIX.1-2001, C89. NOTE system() ofera simplitate i confort: se ocupa de toate detaliile apelurilor fork(2), execl(3) i waitpid(2), precum i de manipularile necesare ale semnalelor; in plus, shell-ul efectueaza substituiile obinuite i redirecionarile de In/Ie pentru comanda. Principalul cost al system() este ineficiena: sunt necesare apeluri de sistem suplimentare pentru a crea procesul care ruleaza shell-ul i pentru a executa shell-ul. Daca macrocomanda de testare a caracteristicii _XOPEN_SOURCE este definita (inainte de includerea fiierelor de antet any), atunci macrocomenzile descrise in waitpid(2) (WEXITSTATUS(), etc.) sunt disponibile atunci cand se include . Dupa cum s-a menionat, system() ignora SIGINT i SIGQUIT. Acest lucru poate face ca programele care il apeleaza dintr-o bucla sa nu poata fi intrerupte, cu excepia cazului in care au ele insele grija sa verifice starea de ieire a copilului. De exemplu: while (ceva-orice) { int ret = system("foo"); if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) break; } In conformitate cu POSIX.1, nu este specificat daca gestionarii inregistrai folosind pthread_atfork(3) sunt apelai in timpul executarii system(). In implementarea glibc, astfel de gestionari nu sunt apelai. Inainte de glibc 2.1.3, verificarea disponibilitaii /bin/sh nu era efectuata daca comanda era NULL; in schimb, se presupunea intotdeauna ca este disponibil, iar system() returna intotdeauna 1 in acest caz. Incepand cu glibc 2.1.3, aceasta verificare este efectuata deoarece, chiar daca POSIX.1-2001 cere ca o implementare conforma sa furnizeze un shell, acel shell poate sa nu fie disponibil sau executabil daca programul apelant a apelat anterior chroot(2) (care nu este specificat de POSIX.1-2001). Este posibil ca comanda shell sa se incheie cu o stare de 127, ceea ce produce o valoare de returnare system() care nu poate fi distinsa de cazul in care un shell nu a putut fi executat in procesul-copil. Avertismente Nu utilizai system() dintr-un program privilegiat (un program set-user-ID sau set-group-ID, sau un program cu capacitai) deoarece valorile ciudate pentru unele variabile de mediu ar putea fi utilizate pentru a submina integritatea sistemului. De exemplu, PATH ar putea fi manipulata astfel incat un program arbitrar sa fie executat cu privilegii. Utilizai in schimb familia de funcii exec(3), dar nu execlp(3) sau execvp(3) (care utilizeaza de asemenea variabila de mediu PATH pentru a cauta un executabil). system(), de fapt, nu va funciona corect din programe cu privilegii set-user-ID sau set-group-ID pe sisteme pe care /bin/sh este bash versiunea 2: ca masura de securitate, bash 2 renuna la privilegii la pornire; (Debian utilizeaza un shell diferit, dash(1), care nu face acest lucru atunci cand este invocat ca sh). Orice intrare a utilizatorului care este utilizata ca parte a comenzii comanda ar trebui sa fie cu atenie igienizata, pentru a se asigura ca nu sunt executate comenzi de shell sau opiuni de comanda neateptate. Astfel de riscuri sunt deosebit de grave atunci cand se utilizeaza system() dintr-un program privilegiat. ERORI Daca numele comenzii incepe cu o cratima, sh(1) interpreteaza numele comenzii ca o opiune, iar comportamentul este nedefinit; (consultai opiunea -c pentru sh(1)). Pentru a rezolva aceasta problema, precedai comanda cu un spaiu, ca in urmatorul apel: system(" -unfortunate-command-name"); CONSULTAI I sh(1), execve(2), fork(2), sigaction(2), sigprocmask(2), wait(2), exec(3), signal(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.9.1 2 mai 2024 system(3)