2016-04-29 10 views
0
mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode); 

これは、shm_fdに4を返します。同じプロセスは、その後もこの1つは2に設定errnoに、すなわちENOENT(そのようなファイルまたはディレクトリ)で失敗2番目のshm_open()はENOENTで失敗します

fd = shm_open("/ipc_shm", O_RDWR, 0); 

を呼び出すライブラリ関数を呼び出します。途中にshm_unlink呼び出しはありません。 2番目の呼び出しに失敗した理由。あなたの助けに感謝。

+0

これを再現できる唯一の方法は、実際に共有メモリが一方向にリンクされているかどうかです。そのプログラムから実行されていない場合は、別のプログラムによって実行されます。 –

答えて

1

私のtest.cの:

予想通り gcc test.c -Wall -lrt作品でコンパイルさ
#include <sys/mman.h> 
#include <sys/stat.h>  /* For mode constants */ 
#include <fcntl.h>   /* For O_* constants */ 

int main (int argc, char *argv[]) 
{ 
     mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
     int shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode); 
     int fd = shm_open("/ipc_shm", O_RDWR, 0); 

     return 0; 
} 

$strace ./a.out 
.... 
statfs("/dev/shm/", {f_type=0x1021994, f_bsize=4096, f_blocks=22290, f_bfree=22290, f_bavail=22290, f_files=55725, f_ffree=55723, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0 
futex(0xb6f5d1c0, FUTEX_WAKE_PRIVATE, 2147483647) = 0 
open("/dev/shm/ipc_shm", O_RDWR|O_CREAT|O_NOFOLLOW|O_CLOEXEC, 0777) = 3 
fcntl64(3, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
open("/dev/shm/ipc_shm", O_RDWR|O_NOFOLLOW|O_CLOEXEC) = 4 
exit_group(0)  

アプリケーション上でstraceを実行し、IPCのすべての出現を検索し、多分にchroot()してください。たぶん何かファイルのリンクを解除しますか?