私がこれを行うとき:
myProgram.h
myProgram.c
struct PipeShm
{
// all my fields
// more
// ...
};
struct PipeShm myPipe = { /* initialization for all fields */ };
struct PipeShm * sharedPipe = &myPipe;
void func()
{
sharedPipe = mmap (NULL, sizeof * sharedPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);
}
mmap
ポインターをコードから任意のメソッドからsharedPipe
呼び出した場合、すべてのプロセスは、構造体と共有した正確な共有メモリを共有しますか?main()
myProgram
myPipe
myPipe
それとも、作成された新しい子供ごとに、自分 の新しい子供がいるでしょうか?
よろしく
編集:
これは、コメントと回答を読んだ後です。変更が行われ、割り当てた後にのみセグメントの値を初期化します。
#include "my_pipe.h"
struct PipeShm * sharedPipe = NULL;
int shm_pipe_init()
{
if (!sharedPipe)
{
int myFd = shm_open ("/myregion", O_CREAT | O_TRUNC | O_RDWR, 0600);
if (myFd == -1)
error_out ("shm_open");
// Allocate some memory in the region - We use ftruncate, write(2) would work just as well
int retAlloc = ftruncate (myFd, sizeof * sharedPipe);
if (retAlloc < 0)
error_out("ftruncate");
sharedPipe = mmap (NULL, sizeof * sharedPipe,
PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, myFd, 0);
if (!sem_init (&sharedPipe->semaphore, 1, 0))
{
sharedPipe->init = TRUE;
sharedPipe->flag = FALSE;
sharedPipe->ptr1 = NULL;
sharedPipe->ptr2 = NULL;
sharedPipe->status1 = -10;
sharedPipe->status2 = -10;
sharedPipe->semaphoreFlag = FALSE;
sharedPipe->currentPipeIndex = 0;
}
else
perror ("shm_pipe_init");
}
return 1; // always successful
}
ただし、問題は継続します。共有メモリはプロセス間であまり共有されていないようです。
int main()
{
int spd, pid, rb;
char buff[4096];
fork();
shm_pipe_init();
// more
return 0;
}
私はまだ出力を取得します。これは、1 つのプロセスのみが実行されているような動作をシミュレートします (複数の出力ではなく、プロセス間の競合状態に応じて、1 つまたは2つのみを取得します)。