Linux 进程间通信(system v 信号灯+system v 共享内存(3)

ipckey = ftok("/home/zhang/shmipcx", 10001);
    if(ipckey == -1)
    {
        perror("ftok");
        exit(1);
    }

shmid = shmget(ipckey, 1024, IPC_EXCL | 0666);
    if(shmid == -1)
    {
        perror("shmget");
        exit(1);
    }
 
    addr_c = (char*)shmat(shmid, NULL, 0);
    if(*((int*)addr_c) == -1)
    {
        perror("shmat");
        exit(1);
    }

/* 定义信号量数据结构 */
    struct sembuf  P, V;
    //union semun arg1, arg2, arg3;

semkey = ftok("/home/zhang/shmipcy", 10001);
    if(semkey == -1)
    {
        perror("ftok");
        exit(1);
    }

/* 创建信号灯集  */
    semid  = semget(semkey, 0, IPC_EXCL | 0666); //如果引用一个现存的集合(一个客户进程), 则将nsems指定为0
    if(semid < 0)
    {
        perror("semget semid");
        exit(1);
    }

/* 初始化 P  V操作  */
    P.sem_num = 0;
    P.sem_op = -1;  //方式是减1(解锁)
    P.sem_flg = SEM_UNDO;
    V.sem_num = 0;
    V.sem_op = 1;  //方式是加1(解锁)
    V.sem_flg = SEM_UNDO;

int i = 0;
    while(i < 10)
    {
        P.sem_num = 0;
        semop(semid,  &P, 1);       //对fullid执行 P 操作

P.sem_num = 2;
        semop(semid, &P, 1);        //对mutexid执行 P 操作

printf("***addr_c[%d] = %c\n", i, addr_c[i]);

V.sem_num = 2;
        semop(semid, &V, 1);        //对mutexid执行 V 操作

V.sem_num = 1;
        semop(semid, &V, 1);        //对empty执行 V 操作

i++;
        sleep(2);
    }

if(shmdt(addr_c) == -1)
    {
        perror("shmdt");
        exit(1);
    }

return 0;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/23342.html