shmctl删除内存。
信号量,虽说可以于通讯,但是更加适合于进程间的同步。通过PV操作相互操作。
编程模型:1、semget:创建信号量,或者获取信号量
semget(ftok(".",123),2,IPC_CREAT | IPC_EXCL |0666) ;
2、semctl:初始化信号量,控制信号量
3、semop:做PV操作(对信号量做加减操作)
ftok,共享内存,消息队列,信号量它们三个都是找一个中间介质,来进行通信的。这种介质多的是,就是要要怎么区分
如下代码:
PV减:
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h> 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 semid = semget(ftok("1",123),2,IPC_CREAT | IPC_EXCL |0666) ; int semid = semget(ftok("1",123),0,0) ; union semun v; v.val = 3; int ret = semctl(semid,1,SETVAL,v); if(ret == -1) printf("semctl err :%m"),exit(-1); struct sembuf sbf; sbf.sem_num = 1; sbf.sem_op = -1; sbf.sem_flg = 0; while(1) { semop(semid,&sbf,1); printf("gogogo\n"); } return 0; }
PV加操作:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h> 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 semid = semget(ftok("1",123),2,IPC_CREAT | IPC_EXCL |0666) ; int semid = semget(ftok("1",123),0,0) ; struct sembuf sbf; sbf.sem_num = 1; sbf.sem_op = 1; //正数是加,负数是减 sbf.sem_flg = 0; while(1) { semop(semid,&sbf,1); //对信号量进行操作 sleep(1); printf("gogogo\n"); } return 0; }
查看原文:http://47.100.160.51/wordpress/?p=109
linux进程通信之信号量
最新推荐文章于 2024-01-25 22:25:34 发布