Вилка () и трубы () в с

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

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

2 ответа

Решение

Труба - это механизм межпроцессного взаимодействия. Данные, записанные в канал одним процессом, могут быть прочитаны другим процессом. Примитив для создания трубы - это 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 в C++.

Имеются stdin а также stdout для общего ввода и вывода.

Общий стиль таков:

input->process->output

Но с трубкой это становится:

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

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

Другие вопросы по тегам