我见过一些popen()/ pclose()的实现。他们都使用的PID的静态列表,并没有锁定:或者popen - 锁还是不线程安全?
static int *pids;
static int fds;
if (!pids) {
if ((fds = getdtablesize()) <= 0)
return (NULL);
if ((pids = malloc(fds * sizeof(int))) == NULL)
return (NULL);
memset(pids, 0, fds * sizeof(int));
}
此,所谓的NetBSD:
static struct pid {
struct pid *next;
FILE *fp;
pid_t pid;
} *pidlist;
/* Link into list of file descriptors. */
cur->fp = iop;
cur->pid = pid;
cur->next = pidlist;
pidlist = cur;
它是什么样子 - 一个不是线程安全的实现?还是我错过了明显的东西?
是的,我看到它锁定了孩子的名单。这好多了。感谢您的链接。 我宁愿popen返回一个pid,然后我把它传递给pclose,但是在这种情况下这不是libc的选项 – 2009-11-11 11:39:40