如何在使用popen()的同时启用read和fd_cloexec

时间:2013-10-22 18:35:37

标签: c linux file-io

我想同时打开一个readfd_cloexec的管道,但是,我无法弄清楚如何设置popen()函数的第二个参数,那里如果运行以下代码,它仍然是子进程中管道的文件描述符。

#include <stdio.h>

int main()
{
   FILE *p=popen("ls -l","re");
   char buf[100];
   memset(buf,0x00,100);

   fread(buf,sizeof(char),10,p);

   if (fork()==0)
   {
      while(1)
      {
      }
   }

   printf("%s",buf);
   pclose(p);

   return 0;
}

1 个答案:

答案 0 :(得分:1)

并非popen的所有版本都支持e修饰符。为了使它一般工作,您需要手动设置文件描述符上的CLOEXEC标志:

FILE *p = popen("ls -l", "r");
fcntl(fileno(p), F_SETFD, FD_CLOEXEC);