2011-01-27 9 views
28

forkとは何ですか、pipeとは何ですか? なぜその使用が必要なのかを説明するシナリオがあれば幸いです。 Cのforkpipeの違いは何ですか? C++で使用できますか?fork()とpipes()in c

ライブビデオ入力にアクセスし、その形式を変換してファイルに書き込むことができるC++プログラムを実装したいからです。 これにはどのような方法が最適でしょうか? 私はこれにx264を使用しました。これまでは、変換の一部をファイル形式で実装しました。 これをライブストリームで実装する必要があります。 パイプを使用するのは良い考えですか?別のプロセスでビデオをキャプチャし、それを他のプロセスに供給しますか?

+0

誰かがVC++で "unistd.h"の代替案を教えてもらえますか – nightWatcher

+0

http://blogs.msdn.com/b/bclteam/archive/2006/12/07/introducing-pipes-justin-van- patten.aspx for answer – nightWatcher

答えて

50

パイプはプロセス間通信のメカニズムです。 1つのプロセスによってパイプに書き込まれたデータは、別のプロセスで読み取ることができます。パイプを作成するためのプリミティブはpipe関数です。これにより、パイプの読み込みと書き込みの両方の端が作成されます。 1つのプロセスがパイプを使用して自分自身と通信することはあまり役に立ちません。典型的な使用では、プロセスは1つまたは複数の子プロセスの直前にパイプを作成します(forks)。このパイプは、親プロセスまたは子プロセス間、または2つの兄弟プロセス間の通信に使用されます。この種の通信に関するよく知られた例は、すべてのオペレーティングシステムのシェルで見ることができます。シェルでコマンドを入力すると、そのコマンドで表される実行可能ファイルが呼び出され、forkが呼び出されます。パイプが新しい子プロセスに開かれ、その出力がシェルによって読み込まれ、出力されます。 This pageには、forkpipe関数の完全な例があります。ちょうどあなたがC++でforkpipeの両方を使用することができ、他のC関数のように

#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; 
    } 
} 

:あなたの便宜のために、コードを以下に再現されます。

+5

パイプが1つのプロセス内で有用な場合が少なくとも1つあります:シグナルを 'select()'ウェークアップに変換するのに使用できます。 – zwol

+0

'pselect'でもこれを行うことができますが、悲しいことにいくつかの壊れたシステムには欠けています... –

+0

徹底的な対応のためにVijayに感謝します。それはまさに私が必要としたものでした – nightWatcher

2

一般的な入力と出力にはstdinstdoutがあります。

共通スタイルは、このようなものです:

input->process->output 

しかしパイプと、それは次のようになります。

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

pipeはすなわちfd[0]fd[1]、2つの一時tmp-inputtmp-outputを返す関数です。