Skocz do zawartości

Mini Shell W C


Andrzej Orkan

Rekomendowane odpowiedzi

Mam mini program, którego zadaniem jest wywołanie w sh jeszcze innego programu. Aplikacja main_app uruchamia w środku aplikację test_app, która teoretycznie zwraca 4, ale proces macierzysty (main_app) pokazuje 256 razy więcej - tzn 1024. Jak zmieniam return na 2 to pokazuje 512 itd....

 

Kod main.c:

 

#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
pid_t pid;
int status=13;
pid = fork();
if (pid == 0)
{ 
  execl("/bin/sh", "sh", "-c", "./test_app", NULL);
}
if (pid != 0)
{ 
  waitpid(pid, &status, 0);
  printf("status: %d\n",status);
}
exit(0);
}

 

Kod test.c:

 

#include <stdio.h>
int main(int argc, char *argv[])
{
printf("program testowy\n");
return 4;
}

 

no i sesja wygląda tak:

 

$ gcc -Wall -pedantic -lm main.c -o main_app
$ gcc -Wall -pedantic -lm test.c -o test_app
$ ./main_app
program testowy
status: 1024
$

 

Nie wiecie może z czego to wynika? Z samego sh czy może execl? Jeśli ktoś wie to proszę o wskazufffkę.

 

ROZWIĄZANE :)

Mianowicie pomyślałem sobie, że przemnożenie przez 256 to to samo co dołożenie ośmiu zer w zapisie bitowym, więc wygląda to tak jakby zwracana liczba ukryta była na 16- bitach w wyższej połówce - wystarczy w aplikacji main_app w odpowiednim miejscu zrobić:

...
printf("status: %d\n",((status >> 8) & 0xff));
...

 

ale dlaczego tam mam szukać tej liczby to nie wiem, i nie wiem co jest za to odpowiedzialne... może ktoś wie?

Odnośnik do komentarza
Udostępnij na innych stronach

Rzecz w tym, ze status przechowuje wiele informacji. Poza tym w jaki sposob zakonczyl sie proces (lub zakonczyl go sygnal) oraz to co zwrocil po zakonczeniu.

Jesli chcesz pobrac wartosc zwracana po zakonczeniu programu uzyj makra WEXITSTATUS poprzedzonego WIFEXITED (dla sprawdzenia w jaki sposob proces sie zakonczyl). Wiecej o nim w 'man waitpid', oraz w naglowkach.

 

przykladowo konstrukcje:

printf("status: %d\n",((status >> 8) & 0xff));

mozesz zastapic:

printf("status: %d\n",WEXITSTATUS(status));

 

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...