// 本進程為信號量數(shù)組的創(chuàng)建進程
#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.創(chuàng)建
? ?// int semget(key_t key, int ?nsems, ?int semflg);
? ?// 參數(shù):
? ?// key ?用于創(chuàng)建信號量數(shù)組的key值
? ?// nsems 創(chuàng)建的信號兩數(shù)組中信號量的個數(shù)
? ?// semflg 與shmget類似惋戏,為信號量數(shù)組的標志位
? ?// ? ? ?IPC_CREAT ? IPC_EXCL ? ?SIRUSR ?SIWUER...
? ?// 返回值:成功领追,返回信號量數(shù)組的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, ...);
// 參數(shù):
// semid ? ?待操作的信號量數(shù)組的ID
// semnum ? 待操作的信號量數(shù)組中的信號兩的編號(從0開始)
// cmd ? ? ?執(zhí)行的具體操作種類
// union semun ?根據(jù)cmd取值的不同绒窑,來傳遞不同的參數(shù)
#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);
// 參數(shù):
// semid ? ?待操作的信號量集ID
// sops nsops ? 組合起來傳遞一個struct sembuf類型的數(shù)組,以供信號量集中的各個編號的信號量進行操作
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;
}