0

Linux で無関係なプロセス間で通信するために共有メモリを使用しています。struct ipc_perm で指定したプロセスだけが共有メモリにアクセスできるようにしたい。しかし、コードは効果がないようです:

プロセス A: 共有メモリを作成する

      int main (int argc, char* argv[]){
          int segment_id;
          key_t key;
          key = 56789;

          char* shared_memory;
          int shm_size = 512;

          segment_id = shmget(key, shm_size, IPC_CREAT | 0666);
          if (segment_id < 0){
             perror("shmget");
             exit(1);
          }else {
             struct shmid_ds shmbuf;
             struct ipc_perm perms;

             //here i specified the process whose
             //uid is 1234 has the read/write access
             //to this shared memory
             perms.uid = 1234;
             perms.gid = 2000;
             perms.mode = 0660;

             shmctl(segment_id, IPC_STAT, &shmbuf);
             shmbuf.shm_perm = perms;
             int ret = shmctl(segment_id, IPC_SET, &shmbuf);
             if (ret < 0){
                 perror("shmctl IPC_SET");
                 exit(1);
             } 
           }

           shared_memory = (char*)shmat(segment_id, NULL, 0);
           if (shared_memory == (char*) -1){
              perror("shmat");
              exit(1);
           }

           sprintf(shared_memory, "Server Updated The Memory -PID- %lu", getpid());
           while(*shared_memory != '*')
               sleep(1);

           printf("The memory has been updated: \n   %s\n", shared_memory);
           sleep(5);
           shmdt(shared_memory);
           shmctl(segment_id, IPC_RMID, 0);
           return 0;
      }

プロセス B: プロセス A によって作成された共有メモリにアクセスする

          int main(){
              int segment_id;
              key_t key;
              key = 56789;

              char* shared_memory, *s;
              int shm_size = 512;

              segment_id = shmget(key, shm_size, 0666);
              if (segment_id < 0){
                   perror("shmget");
                   exit(1);
              }

              shared_memory = (char*)shmat(segment_id, NULL, 0);
              if (shared_memory == (char*) -1){
                   perror("shmat");
                   exit(1);
               }

              for (s = shared_memory; *s != NULL; s++)
                     putchar(*s);
              putchar('\n');

              sprintf(shared_memory, "*Client Updated The Memory - pid-%lu", getpid());
              return 0;
          }

私のテスト中、プロセス B は常にプロセス A によって作成された共有メモリへの読み取り/書き込みアクセスを持っています。なぜこれが起こるのでしょうか? (私はubuntuで実行しており、2つのコンソールを開いて上記のプロセスをそれぞれ開始しています。)

4

1 に答える 1

0

両方のプロセスが UID 1234 または GID 2000 を持っている場合、両方とも共有メモリ セグメントにアクセスできるはずです。ソースのコメント:「uid が 1234 のプロセス」は、UID (ユーザー識別子) という用語を PID (プロセス識別子) と混同していることを示しているようです。

私の知る限り、共有メモリ セグメントへのアクセスを PID によって特定のプロセス セットに制限する方法はありません。shm_perm.uid呼び出し時にそのユーザーの ID を指定することにより、特定のユーザーによって実行されるプロセスに制限することで、shm_ctl(...IPC_SET...)通常は十分です。セグメントにアクセスできるプロセスを制限したい場合は、セグメントにアクセスするために実行するプロセスを制限します。

于 2013-08-11T05:50:28.483 に答える