Zaczynam się uczyć trochę C i podczas badania widelca, czekam na funkcje, które dostałem do nieoczekiwanego wyniku. Przynajmniej dla mnie.Jak używać fork() do tworzenia tylko 2 procesów podrzędnych?
Czy istnieje sposób na utworzenie tylko 2 procesów potomnych od rodzica?
Oto mój kod:
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
/* Create the pipe */
int fd [2];
pipe(fd);
pid_t pid;
pid_t pidb;
pid = fork();
pidb = fork();
if (pid < 0)
{
printf ("Fork Failed\n");
return -1;
}
else if (pid == 0)
{
//printf("I'm the child\n");
}
else
{
//printf("I'm the parent\n");
}
printf("I'm pid %d\n",getpid());
return 0;
}
i tu jest moje wyjście:
I'm pid 6763
I'm pid 6765
I'm pid 6764
I'm pid 6766
Proszę ignorować część rurową, że nie dostał jeszcze tak daleko. Po prostu próbuję utworzyć tylko 2 procesy potomne, więc oczekuję, że 3 "Jestem pid ..." wypisze tylko 1 dla rodzica, na którym będę czekać i 2 procesy potomne, które będą się komunikować przez potok.
Daj mi znać, jeśli zauważysz, gdzie jest mój błąd.
'fork (2)' jest zarówno bardzo proste i jeden z najbardziej niezrozumiany wywołań API w systemie UNIX. Spójrz na "Powiązany" pasek boczny. Czy jest jakiś szczególny powód, dla którego chcesz komunikować się między dwojgiem dzieci, a nie między rodzicem a dzieckiem? – dmckee
Wywołanie fork() dlaczego sprawdzasz pid == 0? Skąd mam wiedzieć, który z nich jest rodzicem, a który jest dzieckiem? – TwilightSparkleTheGeek
@TwilightSparkleTheGeek 'człowiek widelec' stwierdza: WARTOŚĆ ZWRACAJĄCA Po sukcesie, PID procesu potomnego jest zwracany w rodzicu, a 0 jest zwracana w potomku. W przypadku niepowodzenia zwracane jest -1 w obiekcie nadrzędnym, nie jest tworzony proces potomny, a zmienna errno jest ustawiana odpowiednio. – mimoralea