Forum     

Go Back   Digit Technology Discussion Forum > Software > Programming
Register FAQ Calendar Mark Forums Read

Programming The destination for developers - C, C++, Java, Python and the lot


Reply
 
LinkBack (1) Thread Tools Display Modes
Old 19-10-2011, 03:43 PM   1 links from elsewhere to this Post. Click to view. #1 (permalink)
Wahahaha~!
 
Faun's Avatar
 
Join Date: Dec 2006
Location: Pune/there
Posts: 7,675
Default Creating asymmetric tree of process using fork ()


I am trying to write a pseudocode for this process tree using fork(). A little bit of hint will be very helpful.

Here is my approach, pretty sure that it's not correct. Please see attachment.

Quote:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(void)
{
pid_t child_pid[19], wpid;
int status = 0;
int i;
//int a[3] = {1, 2, 1};

printf("parent_pid = %d\n", getpid());
printf("i = %d\n", i);

for(i=1;i<=6;i++)
{

if(i==1){
if ((child_pid[1] = fork()) == 0)
{
printf("In child process (pid = %d)\n", getpid());
//printf("i = %d\n", i);
if ((child_pid[7] = fork()) == 0)
{
printf("In child process (pid = %d)\n", getpid());

if ((child_pid[8] = fork()) == 0)
{
printf("In child process (pid = %d)\n", getpid());

if ((child_pid[9] = fork()) == 0)
{
printf("In child process (pid = %d)\n", getpid());
}

}


}


}


}






while ((wpid = wait(&status)) > 0)
{
printf("Exit status of %d was %d (%s)\n", (int)wpid, status,
(status > 0) ? "still running" : "Ended");
}
return 0;
}
Attached Images
File Type: gif untitled.GIF (13.5 KB, 7 views)
__________________
Blog | Flickr | Battlelog
Spoiler:
Asus Z68 V-Pro|i5 2500k|TRUE Black|Ripjaws X|U2311H|N560GTX|D7000|XONAR STX|RE272|RE0|CC51|XE200PRO Walnut| TD II V2| Ultraphile|N5800

Mono
Faun is online now   Reply With Quote
Advertisements. Register and be a member of the community to get rid of them.
Advertisement

Old 20-10-2011, 12:27 PM   #2 (permalink)
Wahahaha~!
 
Faun's Avatar
 
Join Date: Dec 2006
Location: Pune/there
Posts: 7,675
Default Re: Creating asymmetric tree of process using fork ()

Got to workout the serial code. Will have to use threads to parallelize the branch creation.

Daymn ~
__________________
Blog | Flickr | Battlelog
Spoiler:
Asus Z68 V-Pro|i5 2500k|TRUE Black|Ripjaws X|U2311H|N560GTX|D7000|XONAR STX|RE272|RE0|CC51|XE200PRO Walnut| TD II V2| Ultraphile|N5800

Mono
Faun is online now   Reply With Quote
Old 21-10-2011, 12:04 AM   #3 (permalink)
Mmmph!!!
 
doomgiver's Avatar
 
Join Date: Nov 2010
Location: Mmmphhmph Mmphph
Posts: 1,408
Default Re: Creating asymmetric tree of process using fork ()

printf("i = %d\n", i);

just before the main loop. this will produce garbage (not our esteemed member)


and you are missing a bracket (the for loop, checked in notepad++)


create a loop of 4 iterations,
make a parent process and have them make threads, as you said.

each iteration will be for a branch and thread for child process


or make 4 threads and then loop for the cheld processes.


ps. your code structure was unreadable to me until i formatted it.
__________________
Mmmphh-mphhhh-mmphh mhh!!!

Steam : doomgiver
doomgiver is offline   Reply With Quote
Old 21-10-2011, 06:31 AM   #4 (permalink)
Wahahaha~!
 
Faun's Avatar
 
Join Date: Dec 2006
Location: Pune/there
Posts: 7,675
Default Re: Creating asymmetric tree of process using fork ()

Finally it's done (fork + threads)

Code:
#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/wait.h>

#include <pthread.h>



pid_t child_pid[19], wpid;

int status = 0;

int i=0;





void *tree1(void *il);

void *tree2(void *il);

void *tree3(void *il);



int main(void)

{

    





    printf("parent_pid = %d\n", getpid());

    



    pthread_t pt1, pt2, pt3, pt4, pt5, pt6;

    int iret1, iret2, iret3, ret4, iret5, iret6;









child_pid[0] = fork();



	if (child_pid[0]==0)

	{



		printf("Main parent process 0 (pid= %d) intitiated with Child id %d \n", getpid(), child_pid[0]);

		iret1 = pthread_create(&pt1, NULL, tree1, (void *) i);

		iret2 = pthread_create(&pt2, NULL, tree2, (void *) i);

		iret3 = pthread_create(&pt3, NULL, tree3, (void *) i);



		pthread_join(pt3, NULL);

		pthread_join(pt2, NULL);

		pthread_join(pt1, NULL);







	}else if (child_pid[0] > 0)

	{



		sleep(1);

		printf("\nInside parent process 0 with parent id %d", child_pid[0]);



		waitpid(child_pid[0], &status,0);

		printf("\nExiting process 0\n");



		



	}





  return 0;

}





void *tree1(void *il)

{



	

	int status1=0, status7=0, status8=0, status9=0;

    	pid_t wpid1=0;

	

	child_pid[1] = fork();

			

        if (child_pid[1] == 0)

        {

				

            	printf("\nIn child process 1, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());

        				

		child_pid[7] = fork();



	       	if (child_pid[7] == 0)

     		{

					

           	 	printf("\nIn child process 7, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());

							

			child_pid[8] = fork();

			

			if (child_pid[8]  == 0)

     		   	{



				printf("\nIn child process 8, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



				child_pid[9] = fork();



				if (child_pid[9] == 0)

     			   	{

					

           			 	printf("\nIn child process, 9 (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



	        		}else if (child_pid[9] > 0)

				{

					printf("\nInside parent process 9 with parent id %d", child_pid[9]);

					waitpid(child_pid[9], &status9,0);

					printf("\nExiting process 9\n");

					

	

					

				}

			            

        		}else if (child_pid[8] > 0)

			{

				printf("\nInside parent process 8 with parent id %d", child_pid[8]);

				waitpid(child_pid[8], &status8,0);

				printf("\nExiting process 8\n");

				

				

			}

				



		            

        	}else if (child_pid[7] > 0)

		{

			printf("\nInside parent process 7 with parent id %d", child_pid[7]);

			waitpid(child_pid[7], &status7,0);

			printf("\nExiting process 7\n");

			

			

		}





	}

	else if (child_pid[1] > 0)

	{	

		printf("\nInside parent process 1 with parent id %d", child_pid[1]);

		waitpid(child_pid[1], &status1,0);

		printf("\nExiting process 1\n");

		

		

	}





		



}





void *tree2(void *il)

{



	int status2=0, status10=0;

	child_pid[2] = fork();



	if (child_pid[2] == 0)

     	{



		printf("\nIn child process 2, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



	        child_pid[10] = fork();

					

		if (child_pid[10] == 0)

     		{



			printf("\nIn child process 10, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



	        }else if (child_pid[10] > 0)

		{

			printf("\nInside parent process 10 with parent id %d", child_pid[10]);

			waitpid(child_pid[10], &status10,0);

			printf("\nExiting process 10\n");

			

			

		}





	}else if (child_pid[2] > 0)

	{

		printf("\nInside parent process 2 with parent id %d", child_pid[2]);

		waitpid(child_pid[2], &status2,0);

		printf("\nExiting process 2\n");

		

		/*while ((wpid = wait(&status2)) > 0)

		{

			

			printf("\nExit status of 2 (pid = %d) was %d (%s)\n", (int)wpid, status2,

			       (status2 > 0) ? "still running" : "Ended");exit(0);

		}*/

	}



	



}



void *tree3(void *il)

{



	int status3=0, status11=0, status12=0;

	child_pid[3] = fork();



	if (child_pid[3] == 0)

     	{



		printf("\nIn child process 3, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



	        child_pid[11] = fork();

					

		if (child_pid[11] == 0)

     		{



			printf("\nIn child process 11, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



			child_pid[12] = fork();



			if (child_pid[12] == 0)

     			{



				printf("\nIn child process 12, (pid = %d) and parent is (pid= %d)\n", getpid(),getppid());



	       		 }else if (child_pid[12] > 0)

			{

				printf("\nInside parent process 12 with parent id %d", child_pid[12]);

				waitpid(child_pid[12], &status12,0);

				printf("\nExiting process 12\n");

				

			

			}

	        }else if (child_pid[11] > 0)

		{

			printf("\nInside parent process 11 with parent id %d", child_pid[11]);

			waitpid(child_pid[11], &status11,0);

			printf("\nExiting process 11\n");

			

			

		}





	}else if (child_pid[3] > 0)

	{

		printf("\nInside parent process 3 with parent id %d", child_pid[3]);

		waitpid(child_pid[3], &status3,0);

		printf("\nExiting process 3\n");

		

		/*while ((wpid = wait(&status2)) > 0)



		{

			



			printf("\nExit status of 2 (pid = %d) was %d (%s)\n", (int)wpid, status2,

			       (status2 > 0) ? "still running" : "Ended");exit(0);



		}*/

	}



	



}
OUTPUT:
Quote:
parent_pid = 7864
Main parent process 0 (pid= 7865) intitiated with Child id 0


Inside parent process 1 with parent id 7869
In child process 1, (pid = 7869) and parent is (pid= 7865)
Inside parent process 1 with parent id 7869
In child process 2, (pid = 7870) and parent is (pid= 7865)

Inside parent process 2 with parent id 7870


In child process 7, (pid = 7871) and parent is (pid= 7869)
Inside parent process 2 with parent id 7870
In child process 3, (pid = 7872) and parent is (pid= 7865)

In child process 10, (pid = 7873) and parent is (pid= 7870)



In child process 8, (pid = 7874) and parent is (pid= 7871)

In child process 11, (pid = 7875) and parent is (pid= 7872)
Inside parent process 10 with parent id 7873
Exiting process 10




In child process 12, (pid = 7877) and parent is (pid= 7875)
In child process, 9 (pid = 7876) and parent is (pid= 7874)
Inside parent process 3 with parent id 7872
Exiting process 2
Inside parent process 12 with parent id 7877
Exiting process 12
Inside parent process 9 with parent id 7876
Exiting process 9
Inside parent process 11 with parent id 7875
Exiting process 11
Inside parent process 8 with parent id 7874
Exiting process 8

Exiting process 3
Inside parent process 7 with parent id 7871
Exiting process 7

Exiting process 1

Inside parent process 0 with parent id 7865
Exiting process 0
__________________
Blog | Flickr | Battlelog
Spoiler:
Asus Z68 V-Pro|i5 2500k|TRUE Black|Ripjaws X|U2311H|N560GTX|D7000|XONAR STX|RE272|RE0|CC51|XE200PRO Walnut| TD II V2| Ultraphile|N5800

Mono

Last edited by Faun; 21-10-2011 at 07:30 AM.
Faun is online now   Reply With Quote
Old 21-10-2011, 08:38 AM   #5 (permalink)
Mmmph!!!
 
doomgiver's Avatar
 
Join Date: Nov 2010
Location: Mmmphhmph Mmphph
Posts: 1,408
Default Re: Creating asymmetric tree of process using fork ()

mind if i modify it and use it for college assignment?
__________________
Mmmphh-mphhhh-mmphh mhh!!!

Steam : doomgiver
doomgiver is offline   Reply With Quote
Old 21-10-2011, 09:55 AM   #6 (permalink)
God of Mistakes...
 
Garbage's Avatar
 
Join Date: Dec 2005
Location: Pune, Maharashtra
Posts: 1,923
Default Re: Creating asymmetric tree of process using fork ()

Quote:
Originally Posted by doomgiver View Post
printf("i = %d\n", i);
just before the main loop. this will produce garbage (not our esteemed member)
__________________
Registered Linux User #468778
----------------------------------
http://twitter.com/_Garbage_
Garbage is offline   Reply With Quote
Old 21-10-2011, 10:28 AM   #7 (permalink)
Wahahaha~!
 
Faun's Avatar
 
Join Date: Dec 2006
Location: Pune/there
Posts: 7,675
Default Re: Creating asymmetric tree of process using fork ()

Quote:
Originally Posted by doomgiver View Post
mind if i modify it and use it for college assignment?
Sure.

Error handling has to be done. Further optimization regarding redundant variables can be done. Feel free to contribute.
__________________
Blog | Flickr | Battlelog
Spoiler:
Asus Z68 V-Pro|i5 2500k|TRUE Black|Ripjaws X|U2311H|N560GTX|D7000|XONAR STX|RE272|RE0|CC51|XE200PRO Walnut| TD II V2| Ultraphile|N5800

Mono
Faun is online now   Reply With Quote
Old 21-10-2011, 11:11 AM   #8 (permalink)
Mmmph!!!
 
doomgiver's Avatar
 
Join Date: Nov 2010
Location: Mmmphhmph Mmphph
Posts: 1,408
Default Re: Creating asymmetric tree of process using fork ()

thanks.
__________________
Mmmphh-mphhhh-mmphh mhh!!!

Steam : doomgiver
doomgiver is offline   Reply With Quote
Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


LinkBacks (?)
LinkBack to this Thread: http://www.thinkdigit.com/forum/programming/147778-creating-asymmetric-tree-process-using-fork.html
Posted By For Type Date
Creating asymmetric tree of process using fork () This thread Refback 08-05-2012 08:42 PM

 
Latest Threads
- by Charan
- by Sarath
- by clmlbx

Advertisement




All times are GMT +5.5. The time now is 12:35 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2012, vBulletin Solutions, Inc.

Search Engine Optimization by vBSEO 3.3.2