954,487 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

which process reads the cin

I am working on a code which has several processes forked(). (linux - KDevelop)

The processes after they were created runs paralell in the background.
I want to read on a command line (like cinn >> kill=1 ) which tells the main process to kill all the childs and the main p., but I dont exactly know which process reads the input on the console.

How works the consol after forking. Which process reads the data from it?

Thanks for any suggestion.

slacke
Junior Poster
106 posts since Jun 2006
Reputation Points: 14
Solved Threads: 7
 

what about posting your code?

Nichito
Posting Virtuoso
1,602 posts since Mar 2007
Reputation Points: 424
Solved Threads: 57
 
Which process reads the data from it?


All of them. :) Each process gets a handle to stdin and the computer makes sure that they all get a chance to read from it, but only one at a time.

Hamrick
Posting Whiz
325 posts since Jun 2007
Reputation Points: 180
Solved Threads: 34
 

The code is something like this...

int kill=0;
int proces1;
int proces2;

	void child2()
	{
		for(int b=0; b<100; b++)
		{
			sleep(2);
			cout << "2" << endl;
			if(kill==1)
			{
				cout << "killing child 1..." << endl;
				proces2=0;
				return;
			}
		}
	}
	void child1()
	{
		for(int a=0; a<100; a++)
		{
			sleep(3);
			cout << "1" << endl;
			if(kill==1)
			{
				cout << "killing child 2..." << endl;
				proces1=0;
				return;
			}
		}
	}


int main(int argc, char *argv[])
{


	int pid1, pid2;
	proces1 = 1;
	proces2 = 1;
	
	pid1 = fork();
	if(pid1 == 0)
	{
		child1();
	}
	else
	{
		cout << "forked 1" << endl;
	}


	pid2 = fork();
	if(pid2==0)
	{
		child2();
	}
	else
	{
		cout << "forked 2" << endl;
	}

	cout << "main runing" << endl;

	
	for(int clock=0; clock<100;clock++)
	{
		if(kill==0)
		{
			sleep(5);
			cout << "more processes needed, program runinig..." << endl;
			cin >> kill;
		}
		else
		{
			clock=200;
		}
	}
	
	cout << "killing signal received" << endl;

	sleep(10);		// just for sure 10 secs

	for(int ok=0; ok<1000; ok++)
	{
	if(proces1==0)
	{
		cout << "process 1 killed..." << endl;
		if(proces2==0)
		{
			cout << "process 2 killed..." << endl;
			ok = 1001;
		}
		else
		{
			cout << "zombie processes stil alive..." << endl; 
		}
	}
	}

  return EXIT_SUCCESS;
}


but i'v got a feeling that there is something wrong in basic with that code...

for example I never get the - killing child 1.... or killing child 2...

slacke
Junior Poster
106 posts since Jun 2006
Reputation Points: 14
Solved Threads: 7
 

I was trying to pass state values like kill=1, which should tell to all child processes that they should execute their ending processes and tell to the main process if it was succesful.

But I cant just pass any value to childs. I was trying with global variables (kill, processStatus1) but it did not work. Than I try pointers with same result.

int kill;
int processStatus1;

int main()

 int child1, child2, child3 ...
 
 child1 = fork();... calls the refresh function for example...
 child2 = fork();... calls the virtualSpace function ...
 and so on...

 kill =1;


How can I make this interaction between child and main processes?

slacke
Junior Poster
106 posts since Jun 2006
Reputation Points: 14
Solved Threads: 7
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You