-
IPC Programming in Unix
Hey ,
I'm trying to implement a semaphore which provides mutual exclusion among two processes to a given critical section on Linux. Below is the code which does that. I had written the code initially without the lines commented as "Check1" and "Check2". The code could not provide any mutual exclusion. I added the two lines explained previously for debugging purposes. After adding the lines, the code started giving the required output. I can't figure out what happened. Commenting the lines and running the code leads to the previous undesired output.
Code:
#include<sys/sem.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<unistd.h>
int s;
signal()
{
printf("\ns:%d here \n",getpid()); // Check 1
struct sembuf sa={0,1,0};
semop(s,&sa,1);
}
wait()
{
printf("\nw:%d here \n",getpid()); //Check 2
struct sembuf sa={0,-1,0};
semop(s,&sa,1);
}
void cs() // Critical Section
{
printf("\nProcess%d entering ",getpid());
sleep(1);
printf("\nProcess%d exiting ",getpid());
sleep(1);
}
union semun // The Union Structure for semget
{
int val;
struct semid_ds *buff;
unsigned short int *array;
}
main()
{ int i;
union semun x;
int pid;
s=semget(IPC_PRIVATE,1,0666|IPC_CREAT); // Creating a single semaphore
x.val=1;
semctl(s,0,SETVAL,x); // Initializing semaphore's value to be 1
pid=fork();
for(i=0;i<2;i++)
{
wait(); // Decrement Semaphore
cs();
signal(); // Increment Semaphore
sleep(1);
}
}
Does it ring a bell ?...
-
I'm not getting the right output with those lines in there. I would try and help but using that stuff is completely foreign to me. I just wanted to let you know I don't think the output is right even with those lines, and maybe it was a weird coincidence for you.
-
I'm not sure (its been awhile since I've done this level of coding) maybe you need to flush the buffer. If you replace printf with fflush(); are the results the same?
Cheers,
-D
-
Skiddieleet: I do realize that the lines are of no significance. But the output is correct as far as mutual exclusion is concerned. I've tried many times. The process scheduler is indeed a wild beast
dspeidel: I'm away from my pc now. Shall do it ASAP :-). Thanks anyway.
-
I've modified the code to make
Code:
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdio.h>
int s;
void wait()
{ struct sembuf w={0,-2,0};
printf("\nSemval of %d before wait is %d",getpid(),semctl(s,0,GETVAL));
semop(s,&w,1);
printf("\nnSemval of %d after wait is %d",getpid(),semctl(s,0,GETVAL));
}
void sigz()
{
struct sembuf w={0,+2,0};
printf("\nSemval of %d before wait is %d",getpid(),semctl(s,0,GETVAL));
semop(s,&w,1);
/*mark1*/printf("\nSemval of %d after signal is %d" , getpid(),semctl (s,0,GETVAL));
}
void cs()
{
printf("\nProcess %d entering cs",getpid());
sleep(2);
printf("\nProcesss %d quiting cs",getpid());
sleep(2);
}
union semnu
{
int val;
struct semid_ds *buf;
unsigned short *array;
}
main()
{
int i;
union semnu ss;
s=semget(IPC_PRIVATE,1,0666|IPC_CREAT);
ss.val=2;
semctl(s,0,SETVAL,ss);
fork();
for(i=0;i<3;i++)
{
wait();
cs();
sigz();
sleep(2);
}
}
The Output if fine. But the debugging results are strange. Even after doing a signal on the semaphore, the value is still the same ( the line is commented as mark1 ) . And strangely processes is able to enter the critical section inspite of the 0 value of the semaphore !.