什么是fork
,什么是pipe
?
任何解释为什么使用它们的场景都将受到赞赏。
C中fork
和pipe
之间有什么区别?
我们可以在C ++中使用它们吗?
我需要知道这是因为我想在C ++中实现一个程序,它可以访问实时视频输入,转换其格式并将其写入文件。 对此最好的方法是什么? 我已经使用了x264。到目前为止,我已经在文件格式上实现了转换部分。 现在我必须在实时流上实现它。 使用管道是个好主意吗?在另一个进程中捕获视频并将其提供给另一个进程?
答案 0 :(得分:57)
管道是进程间通信的机制。通过一个进程写入管道的数据可以由另一个进程读取。创建管道的原语是pipe
函数。这会创建管道的读写端。单个进程使用管道与自身通信并不是很有用。在典型的使用中,进程在forks
一个或多个子进程之前创建一个管道。然后,管道用于父进程或子进程之间或两个兄弟进程之间的通信。在所有操作系统shell中都可以看到这种通信的熟悉示例。在shell上键入命令时,它将通过调用fork
生成该命令表示的可执行文件。管道将打开到新的子进程,其输出将由shell读取并打印。 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函数一样,您可以在C ++中同时使用fork
和pipe
。
答案 1 :(得分:3)
常见输入和输出有stdin
和stdout
。
一种常见的风格是这样的:
input->process->output
但是使用烟斗,它变成了:
input->process1->(tmp_output)->(tmp-input)->process2->output
pipe
是返回两个临时tmp-input
和tmp-output
的函数,即fd[0]
和fd[1]
。