• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie z użyciem rodziny funkcji exec - Systemy operacyjne

0 głosów
714 wizyt
pytanie zadane 20 czerwca 2020 w C i C++ przez Oskardes Użytkownik (600 p.)

Mam zadanie do zrobienia na studia. Ale coś nie działa. Program print skompilowałem już jak coś, żeby mieć plik wykonywalny (zgodnie z poleceniem prowadzącego zajęcia). Wszystko pisane w nano i konsoli Ubuntu.  Pomożecie? :)

,, 2. Napisz program, który tworzy jeden wątek macierzysty i jeden potomny. Wątek potomny wywołuje inny program print. Wątek główny wypisuje informację o swoim działaniu z zasypia na 2 sekundy po czym ponownie wypisuje informacje, że skończył swoje zadania a następnie czeka na zakończenie wątku potomnego wypisuje status zakończenia procesu.

Program print.c

#include <stdio.h>

int main(int argc, char *argv[]) {                
printf("tu program print\n");
sleep(4);             
printf("koniec pracy programu print!");
return 0;             
}"
#include <stdio.h>
#include <stdlib.h>

int main(){
        if (fork() == 0){
        execlp("print", 0, NULL);
        }
        else {
        printf("Wątek główny początek\n");
        sleep(2);
        printf("Wątek główny zakończony\n");
        }
return 0;
}



 

1 odpowiedź

+1 głos
odpowiedź 20 czerwca 2020 przez j23 Mędrzec (195,220 p.)
wybrane 21 czerwca 2020 przez Oskardes
 
Najlepsza

Nie czekasz na zakończenie procesu potomnego i nieprawidłowy parametr masz w execlp:

int main()
{
    pid_t id = fork();
    if (id == 0) {
        execlp("print", "print", NULL);
        return -1;
    }

    printf("Wątek główny początek\n");
    sleep(2);
    printf("Wątek główny zakończony\n");

    int status;
    waitid(id, &status, 0);
    return 0;
}

 

komentarz 20 czerwca 2020 przez Oskardes Użytkownik (600 p.)
Niestety w dalszym ciągu nie działa :(
komentarz 20 czerwca 2020 przez j23 Mędrzec (195,220 p.)

Sprecyzuj "nie działa".

komentarz 21 czerwca 2020 przez Oskardes Użytkownik (600 p.)
W dalszym ciągu po skompilowaniu programu, w output wyświetlają się tylko printy z procesu macierzystego, a printy z programu print.c się nie wyświetlają (wynik procesu potomnego).
komentarz 21 czerwca 2020 przez j23 Mędrzec (195,220 p.)

Ok, tak zrób:

// print.c

#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("[print] Starting...\n");
	sleep(4);
	printf("[print] Stopping...\n");
	return 0;
}

 

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

int main()
{
	pid_t id = fork();
	if (id == 0) {
		execlp("./print", "./print", NULL);
		return -1;
	}
 
	printf("[main] Starting...\n");
	sleep(2);
 
	int status;
	waitpid(id, &status, 0);

	printf("[main] Stopping...\n");
	return 0;
}

Podałem złą nazwę funkcji czekającej, bo zamiast waitpid dałem waitid, która ma więcej parametrów. W sumie wystarczyłoby zwykłe wait(&status);

komentarz 21 czerwca 2020 przez Oskardes Użytkownik (600 p.)
Dzięki, działa :)

Podobne pytania

0 głosów
0 odpowiedzi 222 wizyt
+2 głosów
3 odpowiedzi 2,508 wizyt
0 głosów
2 odpowiedzi 365 wizyt
pytanie zadane 8 sierpnia 2020 w Systemy operacyjne, programy przez Dziedzic Obywatel (1,180 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,322 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...