信号数组的创建进程

2017-01-10  本文已影响0人  yueyue216

// 本进程为信号量数组的创建进程

#include

#include

#include

#include

union semun {

   int val;    /* Value for SETVAL */

   struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */

   unsigned short *array;  /* Array for GETALL, SETALL */

   struct seminfo *__buf;  /* Buffer for IPC_INFO

                                          (Linux-specific) */

};

int main(int argc, char *argv[])

{

   int semid;

   key_t key;

   key = ftok("/", 'a');

   // 1.创建

   // int semget(key_t key, int  nsems,  int semflg);

   // 参数:

   // key  用于创建信号量数组的key值

   // nsems 创建的信号两数组中信号量的个数

   // semflg 与shmget类似,为信号量数组的标志位

   //      IPC_CREAT   IPC_EXCL    SIRUSR  SIWUER...

   // 返回值:成功,返回信号量数组的ID;失败,-1

   if((semid = semget(key, 1, IPC_CREAT | 0666)) == -1)

   {

       perror("semget failed");

       return 1;

   }

   printf("semid : %d\n", semid);

// 2.初始化

// int semctl(int semid, int semnum, int cmd, ...);

// 参数:

// semid    待操作的信号量数组的ID

// semnum   待操作的信号量数组中的信号两的编号(从0开始)

// cmd      执行的具体操作种类

// union semun  根据cmd取值的不同,来传递不同的参数

#if 0

union semun {

int val;    /* Value for SETVAL */

struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */

unsigned short *array;  /* Array for GETALL, SETALL */

struct seminfo *__buf;  /* Buffer for IPC_INFO

(Linux-specific) */

};

#endif

union semun arg;

arg.val = 1;        // 指定下标信号量的初始值

semctl(semid, 0, SETVAL, arg);

// 3.wait操作(-1)

// int semop(int semid, struct sembuf *sops, unsigned nsops);

// 参数:

// semid    待操作的信号量集ID

// sops nsops   组合起来传递一个struct sembuf类型的数组,以供信号量集中的各个编号的信号量进行操作

struct sembuf s_op1;

s_op1.sem_num = 0;

s_op1.sem_op = -1;

s_op1.sem_flg = SEM_UNDO;

semop(semid, &s_op1, 1);

   printf("hello shangqian!!!\n");

// 4.post操作(+1)

struct sembuf s_op2;

s_op2.sem_num = 0;

s_op2.sem_op = 1;

s_op2.sem_flg = SEM_UNDO;

semop(semid, &s_op2, 1);

   printf("before destroy sem array...\n");

   system("ipcs -s");

// 5.销毁

semctl(semid, 0, IPC_RMID);

printf("after destroy sem array...\n");

system("ipcs -s");

return 0;

}

上一篇 下一篇

猜你喜欢

热点阅读