c中的fork()和管道()

Posted

技术标签:

【中文标题】c中的fork()和管道()【英文标题】:fork() and pipes() in c 【发布时间】:2011-01-27 04:57:59 【问题描述】:

什么是fork,什么是pipe? 任何解释为什么需要使用它们的场景都将不胜感激。 C语言中forkpipe有什么区别? 我们可以在 C++ 中使用它们吗?

我需要知道这是因为我想用 C++ 实现一个程序,它可以访问实时视频输入、转换其格式并将其写入文件。 最好的方法是什么? 我为此使用了x264。到目前为止,我已经实现了文件格式的转换部分。 现在我必须在直播中实现它。 使用管道是个好主意吗?在另一个进程中捕获视频并将其提供给另一个进程?

【问题讨论】:

谁能告诉我 VC++ 中“unistd.h”的替代方法是什么 blogs.msdn.com/b/bclteam/archive/2006/12/07/… 解答 【参考方案1】:

管道是一种用于进程间通信的机制。一个进程写入管道的数据可以被另一个进程读取。创建管道的原语是pipe 函数。这将创建管道的读取和写入端。单个进程使用管道与自己对话并不是很有用。在典型使用中,一个进程在它之前创建一个管道forks 一个或多个子进程。然后,管道用于父进程或子进程之间或两个兄弟进程之间的通信。在所有操作系统 shell 中都可以看到这种通信的一个熟悉示例。当您在 shell 中键入命令时,它将生成由该命令表示的可执行文件,并调用 fork。一个管道被打开到新的子进程,它的输出被 shell 读取和打印。 This page 具有 forkpipe 函数的完整示例。为方便起见,代码转载如下:

 #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++ 中同时使用 forkpipe

【讨论】:

在一个进程中至少有一种管道有用的常见情况:您可以使用它将信号转换为select()唤醒。 感谢 Vijay 的彻底回复。这正是我所需要的 一个问题!我正在尝试在 VC++ 中执行此操作,它给出了错误“找不到 unistd.h”,为什么会这样?有什么补救措施吗? @nightWatcher:VC++ 不会有 unistd.h。 “uni”用于 Unix。标头用于 Unix 标准函数。在 Windows 中,您将需要使用 Windows 功能。您可能需要一个邮槽或管道。但在 Windows 中,您需要使用 CreatePipe()。阅读 MSDN 上的“进程间通信”。 @Zan thanx alot...我找到了一个很好的链接blogs.msdn.com/b/bclteam/archive/2006/12/07/…【参考方案2】:

stdinstdout 用于公共输入和输出。

常见的样式是这样的:

input->process->output

但是使用管道,它变成:

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

pipe 是返回两个临时tmp-inputtmp-output 的函数,即fd[0]fd[1]

【讨论】:

以上是关于c中的fork()和管道()的主要内容,如果未能解决你的问题,请参考以下文章

C 中的管道 - 我必须使用 fork 吗?

popen() 可以制作像 pipe() + fork() 这样的双向管道吗?

在 fork 后使用读/写管道 2 字符串

C中的管道,用于读取标准输入的缓冲区

C 语言编程 — fork 进程操作

Unix上用C程序实现pipe管道命令“ | “(pipe,fork,dup2,close,execl,重定向)