#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void *func1(void *data)
{
	int i;
	char *string;

	string = (char *)data;

	for (i = 0; i < 10; i++)
	{
		fprintf(stderr, "[%d] --> %s\n", i, string);
	}
}

void *func2(void *data)
{
	int i;
	char *string;

	string = (char *)data;
	for (i = 0; i < 10; i++)
	{
		fprintf(stderr, "--[%d] --> %s\n", i, string);
	}
}

int main()
{
	int pid, pid2;
	int status1 = 0;
	int status2 = 0;
	int pstatus1;
	int pstatus2;
	int c1 = 0;
	int pth_id;
	int retval = -1;
	char *str1 = "RyuHyunSoo";
	char *str2 = "RooluAndJin";

	pthread_t pthr_t[2];
	
	if ( (pid = fork()) < 0 )
	{
		fprintf(stderr, "Cannot Fork(1)!!\n");
	}
	else if ( pid == 0 )
	{
		fprintf(stderr, "Start Child(one) Process!!\n");
//		scanf("%d", &c1);
//		fprintf(stderr, "Child(one) Result is : %d\n", c1);
		
		if (pthread_create(&pthr_t[0], NULL, func1, (void *)str1))
		{
			perror("thread of Child(one) create error:");
			exit(0);
		}
		else
			fprintf(stderr, "Success!! pth_id1 = %d\n", pthr_t[0]);
	}
	else
	{
		fprintf(stderr, "Mother's job with Child(one)\n");

		if ( (pid2=fork()) == 0 )
		{
			fprintf(stderr, "Start Child(two) Process!!\n");
//			scanf("%d", &c1);
//	        fprintf(stderr, "Child(two) Result is : %x\n", c1);
			
			if (pthread_create(&pthr_t[1], NULL, func2, (void *)str2))
			{
				perror("thread of Child(two) create error:");
				exit(0);
			}
			else
				fprintf(stderr, "Success!! pth_id2 = %d\n", pthr_t[1]);
		}
		else
		{
			fprintf(stderr, "Mothers' job with Child(two) !!\n");
			wait(&status1);
		}
		wait(&status2);
	}

	/* Ending .... */
	if (pid == 0 || pid2 == 0)
	{
		fprintf(stderr, "End Child Process!!..(pid=%d)\n", pid);

		if (pid == 0)
		{
			retval = pthread_join(pthr_t[0], (void **)&pstatus1);
			fprintf(stderr, "Thread of Child(one) End %d(%d)\n", (pthread_t)pthr_t[0], retval);
		}
		else if (pid2 == 0)
		{
			retval = pthread_join(pthr_t[1], (void **)&pstatus2);
            fprintf(stderr, "Thread of Child(two) End %d(%d)\n", (pthread_t)pthr_t[1], retval);
		}
	}
	else
	{
		fprintf(stderr, "End Mother Process!!..(pid=%d)\n", pid);
	}
	exit(0);
}
