Ответ 1
Труба - это механизм для межпроцессного взаимодействия. Данные, записанные в трубу одним процессом, могут быть прочитаны другим процессом. Примитив для создания трубы - это функция pipe
. Это создает как контуры чтения, так и записи трубы. Для одного процесса не очень полезно использовать трубку для разговора с самим собой. При типичном использовании процесс создает канал непосредственно перед тем, как forks
один или несколько дочерних процессов. Затем труба используется для связи между родительским или дочерним процессом или между двумя процессами брака. Известный пример такого рода общения можно увидеть во всех оболочках операционной системы. Когда вы вводите команду в оболочке, она выдает исполняемый файл, представленный этой командой, с вызовом fork
. Труба открыта для нового дочернего процесса, и ее выход считывается и печатается оболочкой. Эта страница содержит полный пример функций fork
и pipe
. Для вашего удобства код воспроизводится ниже:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/* Read characters from the pipe and echo them to stdout. */
void
read_from_pipe (int file)
{
FILE *stream;
int c;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF)
putchar (c);
fclose (stream);
}
/* Write some random text to the pipe. */
void
write_to_pipe (int file)
{
FILE *stream;
stream = fdopen (file, "w");
fprintf (stream, "hello, world!\n");
fprintf (stream, "goodbye, world!\n");
fclose (stream);
}
int
main (void)
{
pid_t pid;
int mypipe[2];
/* Create the pipe. */
if (pipe (mypipe))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
/* Create the child process. */
pid = fork ();
if (pid == (pid_t) 0)
{
/* This is the child process.
Close other end first. */
close (mypipe[1]);
read_from_pipe (mypipe[0]);
return EXIT_SUCCESS;
}
else if (pid < (pid_t) 0)
{
/* The fork failed. */
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
/* This is the parent process.
Close other end first. */
close (mypipe[0]);
write_to_pipe (mypipe[1]);
return EXIT_SUCCESS;
}
}
Как и другие функции C, вы можете использовать как fork
, так и pipe
в С++.