0

我有代码,我想将一段特定的代码封装到一个分叉的孩子中,这样如果代码导致问题,它不会影响父级,并且父级将能够报告。

通话exec后我不知道。fork简单明了fork,然后运行通常在父级中运行的代码。

child 中的代码将内容输出到stdoutstderr。由于交错输出和stdio缓冲的问题,我现在正在研究TLPI以获得更好的解决方案。

我想出的想法大致是:

  • pipe()对于每个流
  • fork()
  • 在孩子:
    • close()读取管道末端
    • dup2()写入结束于文件描述符stdoutstderr分别
    • setbuf(fd, NULL)关闭stdio子级内部的流缓冲。
  • 在父母中:
    • close()写管道的末端
    • 使用select//等pselectepoll必须跨 Linux、BSD、AIX、Solaris 等运行)来观察管道的读取端是否有新数据,以及当它write()直接到达父进程中的相应文件描述符时。

dup2现在,我认为孩子的内在和内在之​​间缺少了一步setbuf。它是什么?

setbufFILE*当然需要一段dup2时间int

freopen想到了,但它需要一条路径。如果我只想为流分配一个新的文件号,我该怎么做?

4

1 回答 1

1

extern变量,stdin和是stdout指针。您可以将这些传递给/ 。但是,请注意,孩子有一个单独的地址空间,因此虽然它将在 时继承缓冲区的状态,但两者都可以继续安全地使用缓冲区,如果您和,则输出缓冲区将是空的。stderrFILE *setbufsetvbuffork()fflush STDOUTSTDERR

这是我在孩子身上做的方式(未经测试,请添加一些错误处理):

void
child ( ... )
{
  const char *devnull = "/dev/null";

  /* turn off buffering */

  setvbuf (stdin, NULL, _IONBF);
  setvbuf (stdout, NULL, _IONBF);
  setvbuf (stderr, NULL, _IONBF);

  for (i = getdtablesize () - 1; i >= 0; i--)
    {
      if ((i != write_end_of_pipe1) && (i != write_end_of_pipe2))
        close (i);
    }

  i = open (devnull, O_RDWR);
  if (i == -1)
    {
      fprintf (stderr, "Unable to open /dev/null\n");
      return;
    }

  i = open (devnull, O_RDONLY);
  if (i != 0)
    {
      dup2 (i, 0);
      close (i);
    }

  dup2 (write_end_of_pipe1, 1);
  close (write_end_of_pipe1);

  dup2 (write_end_of_pipe2, 2);
  close (write_end_of_pipe2);

  return;
}
于 2014-04-03T12:50:16.020 回答