공유 메모리의 액세스 제어가 효과가 없습니까?

스티브

공유 메모리를 사용하여 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가 만든 공유 메모리에 대한 읽기 / 쓰기 액세스 권한을 가지고 있습니다. 왜 이런 일이 발생합니까? (저는 우분투에서 실행 중이며 두 개의 콘솔을 열어 위의 프로세스를 각각 시작합니다.)

케이시

두 프로세스에 UID 1234 또는 GID 2000이 있으면 둘 다 공유 메모리 세그먼트에 액세스 할 수 있어야합니다. 소스에 대한 귀하의 의견 : "uid가 1234 인 프로세스"는 UID (사용자 식별자)라는 용어를 PID (프로세스 식별자)와 혼동하고 있음을 나타냅니다.

내가 아는 한 공유 메모리 세그먼트에 대한 액세스를 PID에 의해 특정 프로세스 세트로 제한하는 방법은 없습니다. 특정 사용자가 실행하는 프로세스로 제한하는 것은 일반적으로 shm_perm.uid호출 할 때 해당 사용자의 ID를 지정하여 shm_ctl(...IPC_SET...)충분합니다. 세그먼트에 액세스 할 수있는 프로세스를 제한하려면 세그먼트에 액세스하는 실행 프로세스를 제한하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

벡터의 랜덤 액세스 반복기가 포인터와 달리 동일한 메모리 주소를 제공하는 이유는 무엇입니까?

분류에서Dev

예제 코드가 IUnknown의 삭제 된 메모리에 액세스하는 이유는 무엇입니까?

분류에서Dev

공유 포인터가 보유한 클래스 메소드에 어떻게 액세스합니까?

분류에서Dev

공유 메모리가 있는지 및 액세스하는지 확인

분류에서Dev

Angular의 템플릿 액세스 가능 메서드에 어떤 종류의 액세스 수정자를 제공해야합니까?

분류에서Dev

타사 제공 클래스가있는 중첩 유형을 통해 외부 유형 XXX의 비 정적 멤버에 액세스 할 수 없습니다.

분류에서Dev

스레드 공유 변수가 직접 액세스됩니까?

분류에서Dev

Windows에서 Python과 공유 메모리의 세마포어?

분류에서Dev

C ++에서 다른 두 개의 다른 공유 객체가 세 번째 공유 객체의 Singleton에 액세스 할 수 있습니까?

분류에서Dev

Windows 10 PC가 NAS의 공유 폴더에 액세스 할 수 없음

분류에서Dev

공유 액세스 정책에 하나 이상의 Event Hub 규칙을 추가 할 수 있습니까?

분류에서Dev

64 비트 시스템의 메모리 액세스 오류가 32 비트 주소를 가리키는 이유는 무엇입니까?

분류에서Dev

가상 머신에서 공유 폴더에 액세스 할 수 없습니다.

분류에서Dev

셰이더 (OpenGL 4.0)에서 크기 조정이 가능한 2의 비 제곱 메모리에 어떻게 액세스 할 수 있습니까?

분류에서Dev

CentOS 7.4 Samba 공유 액세스가 거부되었습니다.

분류에서Dev

프로세스가 종료되면 공유 메모리 영역은 어떻게됩니까?

분류에서Dev

AOSP가 Nexus 5x 누락 된 공급 업체 라이브러리에 플래시 되었습니까? 카메라에 액세스 할 수 없습니까?

분류에서Dev

마이크로 컨트롤러의 메모리 값에 액세스 할 때 데이터 값의 끝을 가리키는 이유는 무엇입니까?

분류에서Dev

CUDA의 버그입니까? (불법 메모리 액세스가 발생했습니다)

분류에서Dev

메모리 액세스가 이동보다 느립니까?

분류에서Dev

내 단위 테스트가 내 모델의 공용 정적 상수에 액세스 할 수없는 이유는 무엇입니까?

분류에서Dev

Samba 공유는 한 명의 사용자 만 액세스 할 수 있지만 두 명의 사용자가 액세스 할 수 있어야합니다.

분류에서Dev

공유 메모리가없는 openCL의 다차원 배열?

분류에서Dev

VB.NET MVC가 Viewmodel의 모델에 액세스 할 수 없습니까?

분류에서Dev

메모리 내 HSQLDB의 인스턴스가 Spring 컨텍스트 구성간에 공유됩니까?

분류에서Dev

내 쿼리가 액세스에서 올바른 결과를 제공하지 않습니다.

분류에서Dev

액세스 제어가 유효한 YAML이 아닌 이유

분류에서Dev

Ubuntu 공유 폴더에 로그인 할 때 '액세스가 거부되었습니다'메시지가 나타나는 이유는 무엇입니까?

분류에서Dev

$ esp에서 메모리를 보려고 할 때 Ubuntu gdb가 주소의 메모리에 액세스 할 수 없습니다.

Related 관련 기사

  1. 1

    벡터의 랜덤 액세스 반복기가 포인터와 달리 동일한 메모리 주소를 제공하는 이유는 무엇입니까?

  2. 2

    예제 코드가 IUnknown의 삭제 된 메모리에 액세스하는 이유는 무엇입니까?

  3. 3

    공유 포인터가 보유한 클래스 메소드에 어떻게 액세스합니까?

  4. 4

    공유 메모리가 있는지 및 액세스하는지 확인

  5. 5

    Angular의 템플릿 액세스 가능 메서드에 어떤 종류의 액세스 수정자를 제공해야합니까?

  6. 6

    타사 제공 클래스가있는 중첩 유형을 통해 외부 유형 XXX의 비 정적 멤버에 액세스 할 수 없습니다.

  7. 7

    스레드 공유 변수가 직접 액세스됩니까?

  8. 8

    Windows에서 Python과 공유 메모리의 세마포어?

  9. 9

    C ++에서 다른 두 개의 다른 공유 객체가 세 번째 공유 객체의 Singleton에 액세스 할 수 있습니까?

  10. 10

    Windows 10 PC가 NAS의 공유 폴더에 액세스 할 수 없음

  11. 11

    공유 액세스 정책에 하나 이상의 Event Hub 규칙을 추가 할 수 있습니까?

  12. 12

    64 비트 시스템의 메모리 액세스 오류가 32 비트 주소를 가리키는 이유는 무엇입니까?

  13. 13

    가상 머신에서 공유 폴더에 액세스 할 수 없습니다.

  14. 14

    셰이더 (OpenGL 4.0)에서 크기 조정이 가능한 2의 비 제곱 메모리에 어떻게 액세스 할 수 있습니까?

  15. 15

    CentOS 7.4 Samba 공유 액세스가 거부되었습니다.

  16. 16

    프로세스가 종료되면 공유 메모리 영역은 어떻게됩니까?

  17. 17

    AOSP가 Nexus 5x 누락 된 공급 업체 라이브러리에 플래시 되었습니까? 카메라에 액세스 할 수 없습니까?

  18. 18

    마이크로 컨트롤러의 메모리 값에 액세스 할 때 데이터 값의 끝을 가리키는 이유는 무엇입니까?

  19. 19

    CUDA의 버그입니까? (불법 메모리 액세스가 발생했습니다)

  20. 20

    메모리 액세스가 이동보다 느립니까?

  21. 21

    내 단위 테스트가 내 모델의 공용 정적 상수에 액세스 할 수없는 이유는 무엇입니까?

  22. 22

    Samba 공유는 한 명의 사용자 만 액세스 할 수 있지만 두 명의 사용자가 액세스 할 수 있어야합니다.

  23. 23

    공유 메모리가없는 openCL의 다차원 배열?

  24. 24

    VB.NET MVC가 Viewmodel의 모델에 액세스 할 수 없습니까?

  25. 25

    메모리 내 HSQLDB의 인스턴스가 Spring 컨텍스트 구성간에 공유됩니까?

  26. 26

    내 쿼리가 액세스에서 올바른 결과를 제공하지 않습니다.

  27. 27

    액세스 제어가 유효한 YAML이 아닌 이유

  28. 28

    Ubuntu 공유 폴더에 로그인 할 때 '액세스가 거부되었습니다'메시지가 나타나는 이유는 무엇입니까?

  29. 29

    $ esp에서 메모리를 보려고 할 때 Ubuntu gdb가 주소의 메모리에 액세스 할 수 없습니다.

뜨겁다태그

보관