我正在尝试在两个不同的进程和方案-之间实现二进制信号量:
在父进程中,创建仅包含一个信号量的信号量对象。将信号量初始化为初始值零(0)。 在子进程中执行递减操作,在父进程中执行递增操作。
初始值-0 父级-增量(1) 儿童-减量(0)
我已经在父进程中实现了waitpid()以等待子进程。 尽管我在子块中设置了睡眠状态,以便父母可以首先访问信号量,以便它可以先增加信号量,但仍然可以增加孩子的体重-无法获得父母完成的信号量的增量值。 由于可以在不同的进程之间使用信号量,因此该信号量的增量值应该对孩子可用。
有人可以建议在程序中需要进行哪些更改,以便孩子可以将信号量从1减为0吗? 我已经给出了代码:
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define KEY1 12345
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int main()
{
int ret1,ret, sem, id2;
union semun u1;
struct sembuf sboa,sb;
int status;
sem = semget(KEY1, 1, IPC_CREAT|0600);
if(sem<0) { perror("error in semaphore creation"); exit(1); }
u1.val = 0;
ret1=semctl(sem,0,SETVAL,u1);
ret1 = semctl(sem,0,GETVAL);
printf("Initial value of sem - %d\n",ret1);
ret= fork();
if(ret<0)
{
perror("error in chid");
exit(1);
}
if(ret==0)
{
sleep(1);
printf("child.....before decrement..the value of sem - %d\n",ret1);
sboa.sem_num = 0;
sboa.sem_op = -1;
sboa.sem_flg = 0;
semop(sem, &sboa, 1);
ret1 = semctl(sem,0,GETVAL);
printf("child.....after decrement..the value of sem - %d\n",ret1);
exit(0);
}
if(ret>0)
{
printf("parent.....before increment..the value of sem - %d\n",ret1);
sboa.sem_num = 0;
sboa.sem_op = +1;
sboa.sem_flg = 0;
semop(sem,&sboa, 1);
ret1 = semctl(sem,0,GETVAL);
printf("parent....after increment ..the value of sem - %d\n",ret1);
}
ret = waitpid(-1,&status,0);
if(ret > 0 )
{
printf("Child with the id: %d terminated\n", ret);
if(WIFEXITED(status))
{
printf("Process exited normally\n");
}
else
{
printf("Process exited abnormally");
}
}
else
{
perror("Error in executing waitpid\n");
exit(1);
}
semctl(sem,0,IPC_RMID);
return(0);
}
//该程序的实际输出如下:
sem的初始值-0
父级.....在增加.sem值之前-0
父级。...增加后。.sem的值-1
--> parent incremented
child ..... sem的值递减之前-0
--> child not getting incremented value
child ..... sem的值递减后-0
id:13800的孩子被终止
进程正常退出
//我希望输出为:
sem的初始值-0
父级.....在增加.sem值之前-0
父级....增加后..sem的值-1
child .....在减少sem的值之前-1
child ..... sem的值递减后-0
id:13800的孩子被终止
进程正常退出
有人可以建议程序中需要更改的内容,以便孩子将信号量从1减少到0吗?