(ja po prostu założyć, że mówimy tu linux)
Jak zapewne dowiedział się, sama fork()
po prostu powielać procesu wywołującego, nie obsługiwać IPC.
Z widelcem instrukcji:
fork() tworzy nowy proces przez powielenie procesu wywołującego. Nowy proces, określany jako dziecko, jest dokładnym duplikatem procesu wywołującego, określanego jako rodzic.
Najczęstszym sposobem poradzenia sobie z IPC po rozwidleniu() jest użycie rur, szczególnie jeśli chcesz "prywatny kanał komunikacyjny z każdym dzieckiem". Oto typowy i łatwy przykładem użycia, podobny do tego można znaleźć w instrukcji pipe
(zwracane wartości nie są zaznaczone):
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char * argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
pipe(pipefd); // create the pipe
cpid = fork(); // duplicate the current process
if (cpid == 0) // if I am the child then
{
close(pipefd[1]); // close the write-end of the pipe, I'm not going to use it
while (read(pipefd[0], &buf, 1) > 0) // read while EOF
write(1, &buf, 1);
write(1, "\n", 1);
close(pipefd[0]); // close the read-end of the pipe
exit(EXIT_SUCCESS);
}
else // if I am the parent then
{
close(pipefd[0]); // close the read-end of the pipe, I'm not going to use it
write(pipefd[1], argv[1], strlen(argv[1])); // send the content of argv[1] to the reader
close(pipefd[1]); // close the write-end of the pipe, thus sending EOF to the reader
wait(NULL); // wait for the child process to exit before I do the same
exit(EXIT_SUCCESS);
}
return 0;
}
Kod jest dość oczywista:
- nadrzędna widły()
- Dziecko czyta() z rury aż do EOF pisze
- parent() do rury zamyka() to
- Dane zostały udostępnione, hura!
Stamtąd możesz zrobić wszystko, co chcesz; pamiętaj tylko, aby sprawdzić swoje wartości zwracane i przeczytać: dup
, pipe
, , wait
... podręczniki, będą przydatne.
Istnieje również kilka innych sposobów, aby przesłać dane teleadresowe pomiędzy procesami, oni migh Cię zainteresują chociaż nie spełniają one swoje „prywatne” wymóg:
lub eve na prosty plik ... (Użyłem nawet SIGUSR1/2 signals do wysyłania binarnych danych między procesami raz ... Ale nie poleciłbym tego haha.) I prawdopodobnie więcej, o czym nie myślę teraz .
Powodzenia.
rurociągi! http://www.gnu.org/software/libc/manual/html_node/Pipes-and-FIFOs.html (pamiętaj, że musisz utworzyć potok przed rozwidleniem lub nie mogą się komunikować) –
To zależy od platformy. Na jakiej platformie zamierzasz działać? –