2011-01-27 4 views
28

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

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

+0

Может ли кто-нибудь сказать мне, что является альтернативой для «unistd.h» в VC++ – nightWatcher

+0

http://blogs.msdn.com/b/bclteam/archive/2006/12/07/introducing-pipes-justin-van- patten.aspx для ответа – nightWatcher

ответ

50

Труба - это механизм для межпроцессного взаимодействия. Данные, записанные в трубу одним процессом, могут быть прочитаны другим процессом. Примитив для создания трубы - это функция pipe. Это создает как контуры чтения, так и записи трубы. Для одного процесса не очень полезно использовать трубку для разговора с самим собой. При типичном использовании процесс создает канал непосредственно перед ним forks один или несколько дочерних процессов. Затем труба используется для связи между родительским или дочерним процессом или между двумя процессами брака. Известный пример такого рода общения можно увидеть во всех оболочках операционной системы. Когда вы вводите команду в оболочке, она выдает исполняемый файл, представленный этой командой, с вызовом fork. Труба открыта для нового дочернего процесса, и ее выход считывается и печатается оболочкой. This page имеет полный пример функций 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++.

+5

Существует хотя бы один общий случай, когда труба полезна в одном процессе: вы можете использовать ее для преобразования сигналов в 'select()' wakeups. – zwol

+0

'pselect' тоже может это сделать, но, к сожалению, некоторые сломанные системы этого не имеют ... –

+0

Спасибо Vijay за тщательный ответ. Это было именно то, что мне нужно – nightWatcher

2

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

Обычный стиль выглядит так:

input->process->output 

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

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

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

Смежные вопросы