2009-11-09 204 views
2

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

它是什麼樣子 - 一個不是線程安全的實現?還是我錯過了明顯的東西?

回答

3

如果libc被配置爲可重入(它可能是),GNU libc implementation是線程安全的。但是,對於libc的其他實現,情況可能並非如此。

+0

是的,我看到它鎖定了孩子的名單。這好多了。感謝您的鏈接。 我寧願popen返回一個pid,然後我把它傳遞給pclose,但是在這種情況下這不是libc的選項 – 2009-11-11 11:39:40

3

我不認爲你錯過了明顯的東西。我沒有看到使用popen()或者要求它是線程安全的任何線程安全參考。因此,您應該將其視爲非線程安全的。

+0

我記得線程得到支持時,手冊頁用於明確告訴你函數是安全還是不安全。現在我期望一個功能是安全的,它不會告訴其他.. – 2009-11-09 17:41:43

+2

這將是很好的。但是 - 我會扭轉你的期望 - 除非作者真的想到線程問題,否則函數通常是不安全的。如果在手冊頁中沒有提及,那麼他們可能沒有考慮它。 – Aaron 2009-11-09 17:44:03

+0

至少在Linux上,聯機幫助頁不一定是編寫實現的glibc人編寫的。 – bdonlan 2009-11-09 18:04:18