-
Semaphore trouble
I got my program to compile but i keep getting as segmentation fault when i try to run it can someone please point me in the right direction.
Code:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <string>
#include <ctime>
#include "/home/classes/cs3270ZIM/Lib/semaphore.h"
using namespace std;
int main(int argc, char **argv)
{
int pid;
int randomnums , whogoesfirst, oldnumber, newnumber;
time_t Btime1, Btime2, Etime1, Etime2; // time pointers
Semaphore semaphore(123, 2);
semaphore.Init(0,1);
semaphore.Init(1,99);
srand(time(NULL));// random number seed
randomnums = atoi( argv[1] );
whogoesfirst = atoi( argv[2] );
pid = fork();// process forking in two
if (pid == 0)// Child process
{
time( &Btime1);// process start time
if(whogoesfirst==0) // the parent goes first
{
for(int index = 0; index < randomnums; index++) // random number loop
{
semaphore.Wait(0);
semaphore.Wait(0);
oldnumber = semaphore.ReadValue(1);
newnumber=rand() % 100;
cout << "child:" << " OldNumber: " << oldnumber << "NewNumber: " << newnumber<< endl;
semaphore.Signal(0);
semaphore.Init(1,newnumber);
}
}
else // child first
{
for(int index = 0; index < randomnums; index++) // random number loop
{
oldnumber=semaphore.ReadValue(1);
newnumber=rand() % 100;
cout << "child:" << " OldNumber: " << oldnumber << "NewNumber: " << newnumber << endl;
semaphore.Signal(0);
sleep(5);
semaphore.Wait(0);
}
}
time( &Etime1);// process end time
cout << "\n I am the child; my ID = " << getpid() << "Begin Time: " << ctime (&Btime1)<< "End Time: " << ctime (&Etime1) << endl;
}
else
{ // Parent process
time( &Btime2); // process start time
srand(time(NULL)); //random seeding based on current time
if(whogoesfirst==1) //child first
{
for(int count = 0; count < randomnums; count++)// random number loop
{
oldnumber=semaphore.ReadValue(1);
newnumber=rand() % 100;
cout << "parent:" << " OldNumber: " << oldnumber << "NewNumber: " << newnumber << endl;
semaphore.Wait(0);
}
}
else //parent first
{
for(int index = 0; index < randomnums; index++) // random number loop
{
oldnumber=semaphore.ReadValue(1);
newnumber=rand() % 100;
cout << "parent:" << " OldNumber: " << oldnumber << "NewNumber: " << newnumber << endl;
semaphore.Signal(0);
sleep(5);
semaphore.Wait(0);
}
}
time( &Etime2);// process end time
cout << "\n I am the parent; my ID = " << getpid() << "Begin Time: " << ctime (&Btime2)<< "End Time: " << ctime (&Etime2) << endl;
}
}
You can delete this post i solved my problem.
-
Re: Semaphore trouble
Well, I would try and find out where the segfault is coming from.
Try putting some output lines to find out where the problem is lying. If you use cout, ensure that you use endl or a flush, otherwise it may not output the proper location as the data may not get out to the screen as it may still be buffered. endl calls flush which will ensure that you see the output.
Once you determine where the error is you will have a better idea as to how to fix it. If not, just post your code and output showing where it died and I'm sure someone will try and help ya.
Cheers,
A
-
Re: Semaphore trouble
Did you forget to pass the params to the program?
-
Re: Semaphore trouble
According to the edit comment, looks like he solved his problem.
-
Re: Semaphore trouble
You need to check and validate both argc and argv, otherwise you will get this on the next program you write too.
HTH,