Andrzej Orkan Napisano Grudzień 13, 2006 Zgłoszenie Share Napisano Grudzień 13, 2006 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 More sharing options...
Sanczo Napisano Grudzień 14, 2006 Zgłoszenie Share Napisano Grudzień 14, 2006 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 More sharing options...
Andrzej Orkan Napisano Grudzień 14, 2006 Autor Zgłoszenie Share Napisano Grudzień 14, 2006 Dzięki! Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
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ę