다음 위로 이전 목차 리눅스 프로그래머를 위한 가이드

shmtool:상호작용의 공유 메모리 조종자 (An Interactive shared memory manipulator)



백그라운드 (Background)

시스템 V IPC 객체들의 마지막 예제는 공유 메모리 세그먼트를 만들고, 읽고, 쓰고, 지우기 위한 명령어 라인 툴인 shmtool이다. 다시 한번, 이전의 예제들처럼, 세그먼트는 이전에 존재하고 있지 않면, 어떤 동작을 수행하는 동안에 만들어 진다.


명령어 라인 문법 (Command Line Syntax)



세그먼트에 문자열 쓰기 (Writing strings to the segment)
shmtool w "text"


세그먼트로 부터 문자열 조회하기 (Retrieving strings from the segment)
shmtool r


허가사항 바꾸기 (Changing the Permissions(mode))
shmtool m (mode)


세그먼트 지우기 (Deleting the segment)
shmtool d


예제 (Examples)

shmtool  w   test
shmtool  w   "This is a test"
shmtool  r   
shmtool  d
shmtool  m   660


소스 (The Source)

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SEGSIZE 100

main(int argc, char *argv[])
{
        key_t key;
        int   shmid, cntr;
        char  *segptr;

        if(argc == 1)
                usage();

	/* ftok() 호출을 경유하여 유일한 키값을 만든다 */
        key = ftok(".", 'S');

	/* 공유 메모리 세그먼트를 연다 - 필요하면 만든다 */
        if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0666)) == -1) 
        {
                printf("Shared memory segment exists - opening as client\n");

                /* Segment probably already exists - try as a client */
                if((shmid = shmget(key, SEGSIZE, 0)) == -1) 
                {
                        perror("shmget");
                        exit(1);
                }
        }
        else
        {
                printf("Creating new shared memory segment\n");
        }

	/* 현재 프로세스에 공유 메모리 세그먼트를 연결한다 */
        if((segptr = shmat(shmid, 0, 0)) == -1)
        {
                perror("shmat");
                exit(1);
        }
        
        switch(tolower(argv[1][0]))
        {
                case 'w': writeshm(shmid, segptr, argv[2]);
                          break;
                case 'r': readshm(shmid, segptr);
                          break;
                case 'd': removeshm(shmid);
                          break;
                case 'm': changemode(shmid, argv[2]);
                          break;
                 default: usage();

        }
}

writeshm(int shmid, char *segptr, char *text)
{
        strcpy(segptr, text);
        printf("Done...\n");
}

readshm(int shmid, char *segptr)
{
        printf("segptr: %s\n", segptr);
}

removeshm(int shmid)
{
        shmctl(shmid, IPC_RMID, 0);
        printf("Shared memory segment marked for deletion\n");
}

changemode(int shmid, char *mode) 
{
        struct shmid_ds myshmds;

	/* 내무 자료 구조체로부터 현재 값을 얻는다 */
        shmctl(shmid, IPC_STAT, &myshmds);

	/* 과거의 허가사항을 표시한다 */
        printf("Old permissions were: %o\n", myshmds.shm_perm.mode);

	/* 모드를 수정하고 적재한다 */
        sscanf(mode, "%o", &myshmds.shm_perm.mode);

	/* 모드를 업데이트한다 */
        shmctl(shmid, IPC_SET, &myshmds);

        printf("New permissions are : %o\n", myshmds.shm_perm.mode);
}

usage()
{
        fprintf(stderr, "shmtool - A utility for tinkering with shared memory\n");
        fprintf(stderr, "\nUSAGE:  shmtool (w)rite \n");
        fprintf(stderr, "                (r)ead\n");
        fprintf(stderr, "                (d)elete\n");
        fprintf(stderr, "                (m)ode change \n");
        exit(1);
}


이전:시스템 호출:shmdt() 다음:7 소리 프로그래밍 (Sound Programming)

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 28,1997
Created Nov 28,1997