有码有码!!!信号量集里靠哪一个信号阻塞呢?

时间:2022-06-01 20:14:31
二话不说,linux下,有码如下……


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>

int main()
{
/*生成key*/
key_t key = ftok(".", 100);
/*创建共享内存段*/
int shmid = shmget(key, 12, IPC_CREAT|IPC_EXCL|0600);
if(shmid<0)perror("create"),exit(-1);
/*挂接共享内存段*/
void* p = shmat(shmid, NULL, 0);
if(p==(void*)-1)perror("at"),exit(-1);
/*使用共享内存段进行通信*/
int semid = semget(key, 2, IPC_CREAT|IPC_EXCL|0600);
if(semid<0)printf("%m\n"),exit(-1);
semctl(semid, 0, SETVAL, 0);
semctl(semid, 1, SETVAL, 1);
struct sembuf op[2];
op[0].sem_num = 0;
op[0].sem_op = 1;
op[0].sem_flg = 0;
op[1].sem_num = 1;
op[1].sem_op = -1;
op[1].sem_flg = 0;
int* f = p;
int i;
for(i=100; i<=120; i++){
semop(semid, op, 2);      //此处不明白,请教各位大侠
*f = i;
sleep(1);
}
/*脱接共享内存段*/
if(shmdt(p)<0)perror("dt"),exit(-1);
/*删除共享内存段*/
if(shmctl(shmid,IPC_RMID,NULL)<0)perror("RMID"),exit(-1);
}



semop(semid, op, 2);   这一句我不明白,semid这个信号集中有两个信号,在这个地方希望发生阻塞,那到底以哪个信号的sem_op 为标准去判断该不该阻塞呢???

信号量这个概念我了解,但是一到信号量集这里我就卡住了,希望大侠指导一下!

8 个解决方案

#1


建议LZ看一下关于进程通讯的基础知识。

#2


引用 1 楼 songjinshi 的回复:
建议LZ看一下关于进程通讯的基础知识。


你好,我是因为看那些教材没看懂才来问的。

教材上举的例子都是信号量集中只有一个信号的例子,很少有多个信号量的情况,不信你去瞧瞧

#3


不是很了解 帮顶 有码有码!!!信号量集里靠哪一个信号阻塞呢?

#4


NONBLOCK

#5


唉,这里人气没有其他版块旺啊,我自己顶一下

#6


顶一下

#7


semop(semid, op, 2); 

希望有高手能帮我定量的分析一下程序运行过程中的这一句,如何起到了阻塞的作用的

#8


算了,结贴。 人气太低了

#1


建议LZ看一下关于进程通讯的基础知识。

#2


引用 1 楼 songjinshi 的回复:
建议LZ看一下关于进程通讯的基础知识。


你好,我是因为看那些教材没看懂才来问的。

教材上举的例子都是信号量集中只有一个信号的例子,很少有多个信号量的情况,不信你去瞧瞧

#3


不是很了解 帮顶 有码有码!!!信号量集里靠哪一个信号阻塞呢?

#4


NONBLOCK

#5


唉,这里人气没有其他版块旺啊,我自己顶一下

#6


顶一下

#7


semop(semid, op, 2); 

希望有高手能帮我定量的分析一下程序运行过程中的这一句,如何起到了阻塞的作用的

#8


算了,结贴。 人气太低了