Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Momentul Aprilie 1964

A fost lansat Ubuntu 24.04 LTS

Free streaming SkyShowtime de la ...

Skoda Fabia 1.0 TSI (110 CP)- 19 ...
 Mezina familiei, Merida BigNine

The Tattooist of Auschwitz (2024)

Se poate recupera numar de telefo...

Upgrade de la MacBook Pro M1 cu 8...
 Ce tip de monitor am nevoie pt of...

Resoftare camera supraveghere

Laptop Gaming

Cu ce va aparati de cainii agresi...
 Nu imi platiti coletul cu cardul ...

Exista vreun plan de terorizare p...

Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone
 

Familia de funcții exec

- - - - -
  • Please log in to reply
6 replies to this topic

#1
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
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 :D

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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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.

View Postworm94, 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.
Din nou, sfantul manual spune:

[ 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
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
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

Second Opinion 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate