2

Im trying to write into shared memory but for some reason after i call shmat() and strcpy i get segmentation fault(core dumped) why is that?

This is my code:

int fd,shmid;
key_t shmkey;
char *shm_add;
pid_t pid,pid1=0,pid2=0;

shmkey=ftok("shmdemo.c",'j');
if ( shmkey == (key_t)-1 )
 {
    printf("main: ftok() for shm failed\n");
    return -1;
}
shmid=shmget(shmkey, 50, 0666 | IPC_CREAT | IPC_EXCL);
if (shmid == -1)
{
    printf("main: shmget() failed\n");
    return -1;
}
shm_add=(char *)shmat(shmid,0,0);
if ( shm_add==NULL )
{
    printf("main: shmat() failed\n");
    return -1;
 }

strcpy(shm_add,"hello");

edit: I have file name shmdemo.c on the directory, and the errno of shmget say "File exists" but when i delete "shmdemo.c" from the directory, a new errno comes in the ftok that say "No such file or directory".

Thank you, Asaf.

4

2 に答える 2

2

さまざまなコメントにお答えします。電話すると:

shmget(..., IPC_CREAT | IPC_EXCL);

フラグで言っていることは、このキーの新しい共有メモリ セグメントを作成し、そのキーを持つ共有メモリ セグメントが存在しないことを確認することです。

のみを使用する場合:

shmget(..., IPC_CREAT);

あなたが言っている:このキーを持つ共有メモリ セグメントが既に存在する場合は、それを返します。それ以外の場合は、このキーの新しいキーを作成して返します。

通常、呼び出しの 2 番目のバリアントは必要ないでしょう。並行性は、独自の非決定性を追加しなくても十分に困難です。(つまり、指定された「所有者」プロセスを持つのとは対照的に、一連の協調プロセスのうち最初に来るプロセスが共有メモリを作成できるようにするだけです。)

最初の呼び出しを使用するときに、指定されたキーに共有メモリ セグメントが既に存在する場合、syscall はerrno値で失敗しますEEXISTS。SysV IPC は永続的であるため、たとえばファイル記述子のように、プログラムの終了後に自動的にクリーンアップされることはありません。(実際、これらは一時ファイルに似ています。)

のようなものを使用して、プログラムでそれらをクリーンアップする必要がありますshmctl(shmid, IPC_RMID, NULL);。またはを使用ipcsして残っているIPC オブジェクトをチェックし、それらを削除することもできます。ipcrmcleanipcs

于 2013-05-19T20:22:01.383 に答える
0

フラグを削除IPC_EXCLして、プログラムを確認してください。

于 2013-05-19T16:03:28.580 に答える