2013-02-21 52 views
1

這是一個棘手的問題。由於權限錯誤,無法創建POSIX命名信號(EACCES)

無論系統中沒有信號量的名稱(因此沒有名稱重疊機會),無法創建POSIX命名信號量(sem_open)。這是一個非特權用戶,可以使用shmget創建共享內存。

平臺:的Solaris 10

硬件:英特爾至強E5000系列CPU

上運行AMD的CPU與非特權用戶其他Solaris 10平臺上不會發生。在Linux機器上不會發生。這些機器之間沒有明顯的區別,除了這臺機器很可能是虛擬化的。

代碼:

const char* name = "/permission_test_semaphore"; 

    sem_t* sem = sem_open(name, O_CREAT | O_EXCL, 0644, 0); 
    if (SEM_FAILED == sem) 
    { 
      printf("Could not create test semaphore %s, errno = %d\n", name, errno); 
    } 

輸出是:

Could not create test semaphore /permission_test_semaphore, errno = 13 

任何想法,歡迎 - 我的希望都沒有了。

+1

ipcs與POSIX sems無關。它適用於傳統的sysvipc。 – 2013-02-21 14:40:27

+0

正確 - 雙重檢查。拿出了'ipcs'的參考。謝謝 – Makanaky 2013-02-21 14:42:01

回答

0

首先想到的是安全性或資源限制設置正在阻止它。我想通過http://docs.oracle.com/cd/E19575-01/821-0182/fxxtz/index.html尋找想法。

+0

良好的領導。不幸的是,與正在運行的Solaris機器相比,'prctl $$'沒有區別,例如。 'prctl -n process.max-sem-ops $$'產生默認值。 – Makanaky 2013-02-21 14:22:14

0

在Linux上,/ dev/shm必須存在用於POSIX共享內存和信號量。我懷疑Solaris需要類似的東西。

+0

其他Solaris機器在'dev/shm'上沒有任何東西,創建信號只是起作用。 – Makanaky 2013-02-21 14:18:16

+0

我確認在正在運行的Linux機器上設置'/ dev/shm'。 – Makanaky 2013-02-21 14:25:14

+0

你試過strace了嗎? – 2013-02-21 16:37:43

0

原因是/tmp目錄中沒有權限。用於創建POSIX命名信號的SunOS實現需要在硬編碼/tmp路徑中創建文件。這是在SOLARIS內幕記載,核心內核架構書,454頁:

POSIX信號代碼使用該代碼的內存映射文件的創建和存儲的/ tmp基於文件系統的關於通過sem_open(3R)調用傳遞的參數。

運行truss <executable>將在屏幕出現錯誤之前顯示對/tmp/.SEML<sem_name>的訪問權限。

相關問題