我用我的信号灯不POSIX共享内存,信号量和在unix下叉有麻烦。 我创建了一个指向共享内存2 * sizeof(float)的指针。 我用semctl将我的信号量的值初始化为2。 我在for循环中做了一个fork()(i < 2)。 在子进程(如果叉()== 0)每个子确实信号量(-1)的p的操作,写入到共享存储器然后做一个V操作(1)然后退出。父进程对信号量执行p操作(-2),读取整个共享内存段(使用for循环)并执行v操作(+2)。他在退出之前等待子进程以避免僵尸。 我在输出的问题是,我得到:父进程在子进程之前执行,如何通过信号量强制相反?
Parent reading 0
Parent reading 1
Parent reading 0
Parent reading 1
Child writing 0
Child writing 1
当是我应该得到的是:
Child writing 0
Child writing 1
Parent reading 0
Parent reading 1
我试图初始化我的旗语1而不是2,但只是摊点程序,因为信号量永远不会有两个值,因此父进程永远不会读取。
如果我所理解的关于信号灯是正确的,但事实上,我把它初始化为2意味着父进程可以直接读取,即使没有一个孩子都写任何东西。我该如何解决这个问题?
编辑:我添加了我的代码的简化版本请求,我已删除了错误检查后,并等待孩子减少长度。
/** OPEN MEMORY **/
int shmid1 = shmget(1990, (size), IPC_CREAT | 0666);
float * shmPt = (float*)shmat(shmid1, NULL, 0);
/** CREATE INITIALIZE SEMAPHORE **/
semun1.val = 2;
int semid = semget(1991, 1, 0666 | IPC_CREAT)
semctl(semid, 0, SETVAL, semun1)
/** CREATE PROCESSES **/
for (ii = 0; ii < 2; ++ii) {
if ((p = fork()) == 0) {
int semid = semget(1991, 1, 0666);
struct sembuf p_buf;
p_buf.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = SEM_UNDO;
/** LOCK **/
semop(semid, &p_buf,1);
/** WRITE **/
shmPt[ii] = RandomFloat;
v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = SEM_UNDO;
/** UNLOCK **/
semop(semid, &v_buf,1)
exit(0);
}
else {
int semid = semget(1991, 1, 0666);
struct sembuf p_buf;
p_buf.sem_num = 0;p_buf.sem_op = -2;p_buf.sem_flg = SEM_UNDO;
/** LOCK **/
semop(semid, &p_buf,1);
/** READ **/
for(int j =0;j<2;j++) tabFloat[j] = shmPt[j];
v_buf.sem_num = 0;v_buf.sem_op = 2;v_buf.sem_flg = SEM_UNDO;
/** UNLOCK **/
semop(semid, &v_buf,1)
}
}
编辑: 我的最终目标是让24个孩子写一个接一个成相同大小的共享内存段,并且只当它是满的,那么家长可以读到的一切和处理信息。最重要的是,所有这些都需要处于一段时间的循环中(想象一下,每次完成一圈,每次完成一圈的24辆汽车会持续产生,直到第一辆车完成50圈)
相反_describing_的代码,为什么不是_show_给我们?当你看到并理解你所做的事时,会更加容易。 –
而不是试图描述你的代码,为什么不只是发布你的代码? (在一个简化的形式,如果必要的。) –
我加入了简化代码 – user1895293