-1

我想同时打开一个管道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;
}
4

1 回答 1

1

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

FILE *p = popen("ls -l", "r");
fcntl(fileno(p), F_SETFD, FD_CLOEXEC);
于 2013-10-22T23:40:54.857 回答