Подтвердить что ты не робот

Fork() и pipe() в c

Что такое fork и что такое pipe? Любые сценарии, объясняющие, почему их использование необходимо, будут оценены. В чем разница между fork и pipe в C? Можем ли мы использовать их в С++?

Мне нужно знать, что это потому, что я хочу реализовать программу на С++, которая может получить доступ к живому видеовходу, преобразовать его формат и записать его в файл. Какой был бы лучший подход для этого? Для этого я использовал x264. До сих пор я реализовал часть преобразования в формате файла. Теперь я должен реализовать его в прямом эфире. Можно ли использовать трубы? Захват видео в другом процессе и передача его другому?

4b9b3361

Ответ 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 в С++.

Ответ 2

для общего ввода и вывода существуют stdin и stdout.

Обычный стиль выглядит следующим образом:

input->process->output

Но с трубой это будет:

input->process1->(tmp_output)->(tmp-input)->process2->output

pipe - это функция, которая возвращает два временных tmp-input и tmp-output, т.е. fd[0] и fd[1].