Program wypisuje wartości wg własnego uznania

0

Witam. Właśnie piszę prosty program związany z procesami. Niestety, wynikły dwa problemy:

  1. Program wypisuje teskt dla drugiego i trzeciego procesu w sposób losowy
Proces macierzysty:
UID=28009	GID=10000	PID=8381	PPID=5742	PGID=8381
Proces potomny 1:
UID=28009	GID=10000	PID=8382	PPID=8381	PGID=8381
Proces potomny 2:
Proces potomny 3:
UID=28009	GID=10000	PID=8383	PPID=1	PGID=8381
UID=28009	GID=10000	PID=8384	PPID=1	PGID=8381
Proces macierzysty:
UID=28009	GID=10000	PID=8286	PPID=5742	PGID=8286
Proces potomny 1:
UID=28009	GID=10000	PID=8287	PPID=8286		PGID=8286
Proces potomny 3:
Proces potomny 2:
UID=28009	GID=10000	PID=8289	PPID=1		PGID=8286
UID=28009	GID=10000	PID=8288	PPID=1		PGID=8286

  1. Nie mogę użyć funkcji getpgid(), gdyż dostaję komunikat: > implicit declaration of function ‘getpgid’

Proszę o pomoc w odnalezieniu błędu.

Kod:

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

int main()
{	
	int i=0;

	printf("Proces macierzysty:\n");
	printf("UID=%d	GID=%d	PID=%d	PPID=%d	PGID=%d\n", getuid(), getgid(), 	getpid(), getppid(), getpgrp());

	for(i=1; i<=3; i++)
		{
			switch(fork())
			{
				case -1:
					perror("Cos poszlo nie tak...\n");
					return 1;
					break;
				case 0:
					printf("Proces potomny %d:\n", i);
					printf("UID=%d	GID=%d	PID=%d	PPID=%d	PGID=%d\n", getuid(), getgid(), getpid(), getppid(), getpgrp());
					_exit(0);
					break;
			}
		}
/*getchar();*/
return 0;
}
0

Ok. Problem już rozwiązany. Do switch(fork()) dodałem dafault: wait(0);.
Niestety, wciąż nie wiem, dlaczego kompilator nie widzi deklaracji getpgid().

0

implicit declaration of function ‘getpgid’

To sugeruje że nie ma deklaracji tej funkcji w żadnym z includowanych headerów.

0

Na jakim systemie i czym to kompilujesz?

0

To sugeruje że nie ma deklaracji tej funkcji w żadnym z includowanych headerów.

Nie bardzo wiem, dlaczego taki komunikat się wyświetla. Próbowałem wstawiać zarówno unistd.h, jak i sys/types.h. Wg różnych źródeł (m. in. materiałów od wykładowcy) tam powinna znajdować się deklaracja tej funkcji.

Na jakim systemie i czym to kompilujesz?

System to Ubuntu Mate 17.10, a kompilator to gcc.

0

Nie podajesz argumentu do funkcji getpgid. https://linux.die.net/man/2/getpgid

#include <unistd.h>
/* ... */
printf("UID=%d  GID=%d  PID=%d  PPID=%d PGID=%d\n", getuid(), getgid(), getpid(), getppid(), getpgid(getpid()));
0

Kod wygląda w tej chwili tak:

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


int main()
{	
	int i=0;

	printf("Proces macierzysty:\n");
	printf("UID=%d	GID=%d	PID=%d	PPID=%d	PGID=%d\n", getuid(), getgid(), 	getpid(), getppid(), getpgid(getpid()));

	for(i=1; i<=3; i++)
		{
			switch(fork())
			{
				case -1:
					perror("Cos poszlo nie tak...\n");
					return 1;
					break;
				case 0:
					printf("Proces potomny %d:\n", i);
					printf("UID=%d	GID=%d	PID=%d	PPID=%d	PGID=%d\n", getuid(), getgid(), getpid(), getppid(), getpgid(getpid()));
					_exit(1);
					break;
				default:
					wait(0);
					break;
			}
		}
/*getchar();*/
return 0;
}

Niestety, kompilator podaje taki błąd:

b.c: In function ‘main’:
b.c93: warning: implicit declaration of function ‘getpgid’; did you mean ‘getegid’? [-Wimplicit-function-declaration]
ID=%d PPID=%d PGID=%d\n", getuid(), getgid(), getpid(), getppid(), getpgid(getpid()));

Program się uruchamia. Proszę o pomoc w odnalezieniu przyczyny ostrzeżenia oraz ocenie, czy poniższe wartości są prawidłowe.

Proces macierzysty:
UID=1000 GID=1000 PID=5151 PPID=4947 PGID=5151
Proces potomny 1:
UID=1000 GID=1000 PID=5152 PPID=5151 PGID=5151
Proces potomny 2:
UID=1000 GID=1000 PID=5153 PPID=5151 PGID=5151
Proces potomny 3:
UID=1000 GID=1000 PID=5154 PPID=5151 PGID=5151

1 użytkowników online, w tym zalogowanych: 0, gości: 1