-
December 11th, 2006, 05:56 PM
#1
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 ?...
-
December 12th, 2006, 02:32 AM
#2
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.
-
December 12th, 2006, 09:45 PM
#3
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
If you spend more on coffee than on IT security, you will be hacked. What\'s more, you deserve to be hacked.
-- former White House cybersecurity adviser Richard Clarke
-
December 13th, 2006, 03:07 AM
#4
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.
-
December 17th, 2006, 08:50 AM
#5
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 !.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
|