我想同时打开一个read
和fd_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;
}
答案 0 :(得分:1)
并非popen
的所有版本都支持e
修饰符。为了使它一般工作,您需要手动设置文件描述符上的CLOEXEC标志:
FILE *p = popen("ls -l", "r");
fcntl(fileno(p), F_SETFD, FD_CLOEXEC);