Nowe posty

Autor Wątek: Mini powłoka - uruchomienie podprogramu błąd  (Przeczytany 2953 razy)

  • Gość
Mini powłoka - uruchomienie podprogramu błąd
« dnia: 2010-02-28, 21:05:08 »
Próbuję napisać swoją mini powłokę (bardzo prostą) tak dla ćwiczeń i oczywiście mnie nie wychodzi próbowałem to tak:

#include 
#include
#include

int main (){
int dziecko;
char bufor[256];

while (1) {

fgets (bufor, 256, stdin);

if (strstr(bufor, "at\\n")!=NULL) printf ("AT\\n"); else {
if (strstr(bufor, "exit\\n")) {
printf ("Zakańczam prace... na życzenie\\n");
exit(0);
} else {

printf ("Uruchamiam\\n");
dziecko = fork ();

if (dziecko==0) {
printf ("Ja dziecko ginę\\n");
execve ("/usr/ls", NULL, NULL);
exit(0);
} else {
perror ("Blad fork");
exit(1);
}

}
}

}

return 0;
}
Lecz oczywiście to nie wychodziło:

Cytuj
tomasz@tomasz-laptop:~$ ./program
as
Uruchamiam
Ja dziecko ginę
Blad fork: Success
Pytanie jest: jak moja mini powłoka powinna uruchamiać inne programy?

jk33

  • Gość
Mini powłoka - uruchomienie podprogramu błąd
« Odpowiedź #1 dnia: 2010-02-28, 22:56:52 »
1) Jakie wartości zwraca fork i co one oznaczają?
Bo wartość różna od zera wcale nie oznacza błędu...
Nawet inaczej. Musi zostać zwrócona w jednym z procesów inna wartość.
man fork

2)
if (dziecko==0) {
printf ("Ja dziecko ginę\\n");
Nie bardzo rozumiem związek między komunikatem a wykonywaniem programu.

3)
execve ("/usr/ls", NULL, NULL);
exit(0);
Przeczytaj dokumentację funkcji execve. Generalnie jeśli wykona się linijka exit(0) to znaczy że wystąpił błąd. To jedno.
Drugie: zamiast używać execve, byż może będzie Ci wygodniej skorzystać z innej funkcji:
 execl, execlp, execle, execv, execvp
Trzecie: Należałoby jednak przekazać przynajmniej jeden argument przez argv -- nazwę programu.

4)
Cytat: Xgrzyb90
Lecz oczywiście to nie wychodziło:
Oczywiście == ??

5) Należy obsłużyc zakończenie się każdego z procesów potomnych.
(czego tu nie robisz)
Słowa kluczowe: proces zombie, wait, SIGCHLD