Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Se pot monta placi de gresie de 1...

Card de debit virtual emis de India

Diferenta ATS generator si PV

La multi ani @Lotusisrael!
 Declarație primar

Contestare amenda politia locala

PC se restarteaza cu erori ecran ...

Mercedes atego 815 oprire motor
 Ce contine Creion rani dupa ras?

Filtru sedimente inainte de pompa?

Paște fericit!

electrician constructor video curs
 Cum pot bloca transferul de date ...

Ce reprezinta in chimie abrevieri...

Google pay ma taxeaza in timp ce ...

Kia Picanto 2022 - Problema motor?
 

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

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

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