簡體   English   中英

posix在線程中創建共享內存

[英]posix shared memory creation in thread

我是Linux編程的新手,請保持警惕! 方案說明

我正在嘗試實現上述方案。 在這里,使用fork()創建兩個進程,每個進程都有N個線程。 進程1的線程創建一個請求並將其排隊在隊列1中。進程2的線程使一個請求出隊列並將響應發送回隊列2。每個請求都由shmidsize組成,其中shmid是這樣生成的共享內存段-

shmid = shm_open(<a random string>, O_CREAT | O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG);

if (shmid < 0) {
    perror("failure on shm_open");
    exit(1);
}
if (ftruncate(*share, size) == -1) {
    perror("Error on ftruncate\n");
    exit(-1);
}

創建后,我可以在同一線程中立即打開和修改此共享內存段

void* request = mmap(NULL, size, PROT_WRITE, MAP_SHARED, shmid, 0);
memset(str, 'w', size);

之后,我使用隊列1將shmid傳遞到進程2。

我的問題是,當進程2中的線程嘗試使用相同的方式打開此shmid時,我得到了EBADF: fd is not a valid file descriptor錯誤。 我已經通過在進程1和2中打印值來確認出隊后shmid是正確的。

如果從不同的進程/線程創建進程,則無法在進程之間創建共享內存段嗎? 關於如何使它起作用的任何想法?

請讓我知道是否需要更多信息。

如果您嘗試訪問由另一個進程創建的文件描述符,則該文件描述符將不起作用。 文件描述符僅在創建它們的過程中很有用。我之所以這么說是因為您看到的錯誤。

但是您有共享內存的正確想法,您可以為兩個進程創建一個映射內存的共享段,這可能會使爭用情況變得很麻煩,每個進程中都有多個線程競爭訪問它,或者您可以創建一個套接字,並且讓您的兩個進程通過那個或管道進行通信。

我會建議您嘗試實現IPC的AF_UNIX套接字。

共享內存段必須在兩個進程中都打開。

如果兩個進程都是由公共父節點的fork()創建的,則只需在fork()之前執行shm_open() fork() ,它將被兩個子進程繼承。

另外,每個進程都可以調用shm_open() ,為name參數傳遞相同的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM