我見過一些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