LINUX.ORG.RU

Поясните про fork.

 ,


0

3

Здравствуйте, господа. Суть такова - хочу, чтобы был главный процесс, который бы висел в event loop'е. При наступлении определенного события, порождал новый процесс и выполнял задачу, а главный, так и висел в своем цикле. Я знаю, как это сделать через треды, но хочу именно через форк. Покидайте советов чтоли или книжек, а то я погуглил, ничего дельного не нашел.

while(1) {
   wait event
   //при наступлении события делать fork какой-то хитрый, который будет выполнять
   //код в другом процессе. А родительский так и продолжит ждать события.
}

Как я понял, если просто вызвать fork(), то в цикле будут висеть оба процесса и все портить.

fork() возвращает 0 родительскому процессу. Проверяешь возвращаемое значение, в родительском продолжаешь отслеживать события, в дочернем - обрабатываешь задание.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

fork() возвращает 0 родительскому процессу

Родителю — PID ребёнка, а ребёнку — 0. Ребёнок может узнать PID родителя с помощью getppid().

i-rinat ★★★★★
()
Ответ на: комментарий от arturpub
char c;
	while (1) {
		my_pid = getpid();
		printf("my pid %d\n", my_pid);
		scanf("%c", &c);

		if (c == 'f') {
			if ((child_pid = fork()) < 0) {
				perror("fork failure");
				exit(1);
			}

			if (child_pid == 0) {
				printf("a new-born process\n");
				sleep(3); //hard work
				printf("Child: done\n");
				_exit(0);
			} else {
				printf("wait pid\n");
				//waitpid(child_pid, NULL, 0);
			}
		} else if (c == 'e') {
			printf("exiting\n");
			exit(0);
		}
	}

Вроде то что нужно, не? Но как зомбаков собирать, непонятно. waitpid блокирует цикл. И еще, почему printf(«my pid %d\n», my_pid); вызывается два раза в начале цикла, если ребенок делает exit сразу после слипа?

twentypercentcooler
() автор топика
Ответ на: комментарий от twentypercentcooler

На телефоне я, тяжело твою портянку читать, но скажу сразу, во-первых вызывай fflush для открытых файлов перед форком, т.к. FILE* буферизуется и ты получаешь два процесса с одинаковым буфером, который флушится при exit. Кроме того есть куча других проблем, atexit может удалить временный файл например, так что в общем виде чилд должен делать _exit вместо exit.

По зомби не помню какой дефолт, первый ответ http://stackoverflow.com/questions/7171722/how-can-i-handle-sigchld-in-c

arturpub ★★
()
Ответ на: комментарий от twentypercentcooler

А, вижу, что _exit в чилде. По идее после первого принта буфер должен скинуться, т.к. скорее всего line-oriented, странно что он все еще там.

arturpub ★★
()
Ответ на: комментарий от twentypercentcooler

И еще, почему printf(«my pid %d\n», my_pid); вызывается два раза ...

scanf("%c", &c);
printf("c=%i\n", c);
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.