[C] Procesy potomne i macierzyste

marek258
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 20 sty 2015, o 19:45
Płeć: Mężczyzna
Lokalizacja: Warszawa

[C] Procesy potomne i macierzyste

Post autor: marek258 »

Dzień dobry.
Proszę o pomoc przy tych dwóch kodach:

Kod: Zaznacz cały

main(argc,argv)
int argc;
char *argv[ ];
{
for(i = argc;i>0;i--)
printf("%d %s
", i, argv[i]);
}
co się w nim dzieje?

oraz drugi:

Kod: Zaznacz cały

main()
char nr;
{
gets(c);
if (nr=fork(0)>0){
printf("potomny, %c
", nr);
execl("/bin/sh","sh",c);
else
printf("macierzysty
")
}
czy są w nim jakieś błędy?
Dziękuję za pomoc.
Ostatnio zmieniony 20 sty 2015, o 20:50 przez Afish, łącznie zmieniany 2 razy.
Powód: Brak tagów \code.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C] Procesy potomne i macierzyste

Post autor: Dasio11 »

1. Jest błąd w składni funkcji main. Ponadto zmienna i jest niezadeklarowana oraz dla i=argc przekroczony jest zakres argv. Powinno być tak:

Kod: Zaznacz cały

int main( int argc, char* argv[] )
{
    int i;
    for( i = argc-1; i > 0; --i )
        printf( "%d %s
", i, argv[i] );
}
Ten program przyjmuje dowolną liczbę argumentów z linii poleceń i wypisuje je ponumerowane w konsoli, zaczynając od ostatniego, a wyłączając zerowy (którym zawsze jest nazwa programu).


2. Używasz funkcji, ale nie dołączasz potrzebnych plików nagłówkowych. Znów zły format funkcji main. nr powinien być typu int, a c nie jest zadeklarowane. fork nie przyjmuje argumentów. Porównanie ma wyższy priorytet od przypisania, więc wewnątrz warunku if zmienna nr nie przyjmie jako wartości tego, co zwróci fork(), tylko wynik porównania fork()>0. Na końcu listy parametrów funkcji execl należy umieścić (char*) NULL.
Jest też błąd merytoryczny. Procesem macierzystym będzie ten, w którym fork() zwróci dodatnią liczbę - będzie ona oznaczała identyfikator utworzonego procesu.

Poprawiony kod:

Kod: Zaznacz cały

#include <stdio.h>
#include <unistd.h>

int main()
{
    char c[256];
    gets( c );
    
    int nr;
    if( ( nr = fork() ) > 0 )
    {
        printf( "macierzysty, %d
", nr );
    }
    else
    {
        printf( "potomny
" );
        execl( "/bin/sh", "sh", c, (char*) NULL );
    }
    
    return 0;
}
ODPOWIEDZ