1

This is a homework question. I have to write a program forking itself 20 times. Each new process is adding +1 to a variable (integer) which is shared between all of them. The thing is, I have to use semaphores (IPC). This piece of code is 'working' - giving the value of 20 in the end.

*buf = 0; for(i=1; i<=20; ++i) { if(fork()!=0) { *buf += 1; exit(0); } } 

EDIT: Based on this code I am trying to get output like :
I am child 1...
I am child 2...
.
.
.
I am child 20...

It worked once (first time), and then the order became random. But I did not change any code. What am I doing wrong?

1
  • 2
    You possibly got your fork() call wrong. It returns non-zero to the parent process; therefore, only your parent increments the value. Commented Jan 3, 2012 at 2:17

1 Answer 1

2

Well your major problem is this:

 if (fork()!=0) //<-- this 

fork() will return -1 on error, the parent pid, OR ZERO for the child. So you are actually doing everything in the parent. Change to (fork() ==0) and it does what you want.

Also you should wait on your children and detach shared memory. (I added some output of the process ids to make it a little clearer.)

printf("I AM THE PARENT pid = %d\n", getpid()); *buf = 0; for(i=1; i<=20; ++i) { if((pid = fork()) == -1) { perror("fork"); exit(1); } if (pid == 0) { v(semid, 0); *buf += 1; p(semid, 0); printf("I am child %d with pid = %d\n", i, getpid()); shmdt(buf); exit(0); } } for (i = 1; i <= 20; ++i) { pid = wait(&status); printf("child pid = %d reaped\n", pid); } printf("buf: %p\n", buf); printf("*buf: %d\n", *buf); shmdt(buf); return 0; 
Sign up to request clarification or add additional context in comments.

1 Comment

@Jonathan Leffler Yeah, bad wording. I'll change it.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.