ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] Просьба потестировать
@ 2004-03-21  7:20 Michael Pozhidaev
  2004-03-21  8:24 ` Andrey Rahmatullin
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-21  7:20 UTC (permalink / raw)
  To: devel

Здравствуйте!
При разработке небольшой утилиты столкнулся с проблемой, которую 
никак не могу победить. О проблеме я уже писал, не работает fork. 
Все возможные причины я уже исключил, динамическая память не 
используется, никаких элементов ipc нет, все зомби аккуратно 
убиваются, тем не менее, fork работает только определённое 
количество раз. Если у кого-нибудь есть время и возможность, 
помогите - запустите небольшой экспериментальный файл в своей 
среде. Я думаю, может быть, у меня неверно ядро работает, или ещё 
что-нибудь не так в моей системе? Я был бы рад, если бы 
кто-нибудь согласился посмотреть исходник небольшого файла, где 
эта проблема появляется, и указал на возможные причины.
-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-21  7:20 [devel] Просьба потестировать Michael Pozhidaev
@ 2004-03-21  8:24 ` Andrey Rahmatullin
  2004-03-21  9:03   ` Michael Pozhidaev
  0 siblings, 1 reply; 13+ messages in thread
From: Andrey Rahmatullin @ 2004-03-21  8:24 UTC (permalink / raw)
  To: devel

[-- Attachment #1: Type: text/plain, Size: 398 bytes --]

On Sun, Mar 21, 2004 at 01:20:26PM +0600, Michael Pozhidaev wrote:
>количество раз. Если у кого-нибудь есть время и возможность, 
>помогите - запустите небольшой экспериментальный файл в своей 
>среде.

Где файл? ;)

-- 
WBR, wRAR (ALT Linux Team)

Эти два факта (отсутствие строк и присутствие адресной арифметики)
превращают этот язык [C] в диверсию отраслевого масштаба.
		-- mithraen in devel@

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-21  8:24 ` Andrey Rahmatullin
@ 2004-03-21  9:03   ` Michael Pozhidaev
  2004-03-21  9:46     ` Andrey Rahmatullin
                       ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-21  9:03 UTC (permalink / raw)
  To: ALT Devel discussion list

Andrey Rahmatullin пишет:
> On Sun, Mar 21, 2004 at 01:20:26PM +0600, Michael Pozhidaev wrote:
>> количество раз. Если у кого-нибудь есть время и возможность, помогите 
>> - запустите небольшой экспериментальный файл в своей среде.
> Где файл? ;)
Предыдущее письмо с файлом в рассылку не прошло. Посылаю просто так.
Программа ждёт в качестве первого параметра запуска какой-нибудь
wav-файл, длительность которого больше хотя бы 1 секунды.  На
консоль программа выводит количество успешных запуском процесса
для воспроизведения звука. У меня таких запусков не больше 120.
// BEGIN
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>
pid_t mp;
void play(char *name)
{
	mp = fork();
	if (mp == 0)	
	{
		pid_t pp;
		setpgrp();
		pp = fork();
		if (pp == 0)
		{
			execlp("play", "play", name, NULL);
		}
		waitpid(pp, NULL, 0);
		exit(0);
	}
}
void stop()
{
	pid_t p;
	killpg(mp, SIGKILL);
	while((p = waitpid(-1*mp, NULL, WNOHANG))>0);
}
int main(int argc, char *argv[])
{
	int k = 1;
	play(argv[1]);
	while(1)
	{
		printf("%u\n", k++);
		sleep(1);
		stop();
		play(argv[1]);
	}
	return (0);
}

// END

-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-21  9:03   ` Michael Pozhidaev
@ 2004-03-21  9:46     ` Andrey Rahmatullin
  2004-03-21 10:14       ` Michael Pozhidaev
  2004-03-21 11:48     ` {Spam?} " Sergey Vlasov
  2004-03-22  9:22     ` Sergey Pinaev
  2 siblings, 1 reply; 13+ messages in thread
From: Andrey Rahmatullin @ 2004-03-21  9:46 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 1179 bytes --]

On Sun, Mar 21, 2004 at 03:03:10PM +0600, Michael Pozhidaev wrote:
>Программа ждёт в качестве первого параметра запуска какой-нибудь
>wav-файл, длительность которого больше хотя бы 1 секунды.  На
>консоль программа выводит количество успешных запуском процесса
>для воспроизведения звука. У меня таких запусков не больше 120.

$ ulimit -u
128
$ ./1 auth.wav
[...]
94
95
/usr/bin/play: fork: Resource temporarily unavailable
96
/usr/bin/play: fork: Resource temporarily unavailable
$ ulimit -u 256
$ ulimit -u
256
$ ./1 auth.wav
[...]
221
222
/usr/bin/play: fork: Resource temporarily unavailable
223
/usr/bin/play: fork: Resource temporarily unavailable


Но ведь процессы-то не одновременно работают?

man setrlimit:
  RLIMIT_NPROC
       The maximum number of processes that can be created for the real
       user ID of the calling process.  Upon encountering  this limit,
       fork() fails with the error EAGAIN.

Так созданных или созданных одновременно?

-- 
WBR, wRAR (ALT Linux Team)

> Ну, не знаю, все мои пакеты в Сизифе сейчас абсолютно стабильны. :)
Эх, Дмитрий! Если бы мы пользовались только Вашими пакетами.
Ведь еще и своими приходиться.
		-- jaa in sisyphus@

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-21  9:46     ` Andrey Rahmatullin
@ 2004-03-21 10:14       ` Michael Pozhidaev
  0 siblings, 0 replies; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-21 10:14 UTC (permalink / raw)
  To: ALT Devel discussion list

Andrey Rahmatullin пишет:
> On Sun, Mar 21, 2004 at 03:03:10PM +0600, Michael Pozhidaev wrote:
>> Программа ждёт в качестве первого параметра запуска какой-нибудь
>> wav-файл, длительность которого больше хотя бы 1 секунды.  На
>> консоль программа выводит количество успешных запуском процесса
>> для воспроизведения звука. У меня таких запусков не больше 120.
> $ ulimit -u
> 128
> $ ./1 auth.wav
> [...]
> 94
> 95
> /usr/bin/play: fork: Resource temporarily unavailable
> 96
> /usr/bin/play: fork: Resource temporarily unavailable
> $ ulimit -u 256
> $ ulimit -u
> 256
> $ ./1 auth.wav
> [...]
> 221
> 222
> /usr/bin/play: fork: Resource temporarily unavailable
> 223
> /usr/bin/play: fork: Resource temporarily unavailable
> Но ведь процессы-то не одновременно работают?
Не одновременно. Каждую секунду порождается процесс, который 
будет корнем процессной группы, и процесс для вызова play. Перед 
тем, как выполнить очередной раз эту операцию, вызывается 
killpg(pid, SIGKILL), который убивает полностью процессную группу 
от предыдущего шага.  Таким образом происходит последовательное 
порождение и завершение процессов и ничего оставаться не должно, 
я думаю. Почему эту операцию можно выполнить только установленное 
количество раз, я понять не могу.
> man setrlimit:
>  RLIMIT_NPROC
>       The maximum number of processes that can be created for the real
>       user ID of the calling process.  Upon encountering  this limit,
>       fork() fails with the error EAGAIN.
> 
> Так созданных или созданных одновременно?
Похоже, что созданных вообще за время работы программы в главном 
процессе. Но какой смысл накладывать такие ограничения?

-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)



^ permalink raw reply	[flat|nested] 13+ messages in thread

* {Spam?} Re: [devel] Просьба потестировать
  2004-03-21  9:03   ` Michael Pozhidaev
  2004-03-21  9:46     ` Andrey Rahmatullin
@ 2004-03-21 11:48     ` Sergey Vlasov
  2004-03-21 13:13       ` Michael Pozhidaev
  2004-03-22  9:22     ` Sergey Pinaev
  2 siblings, 1 reply; 13+ messages in thread
From: Sergey Vlasov @ 2004-03-21 11:48 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 863 bytes --]

On Sun, Mar 21, 2004 at 03:03:10PM +0600, Michael Pozhidaev wrote:
[skip]
> void stop()
> {
> 	pid_t p;
> 	killpg(mp, SIGKILL);
> 	while((p = waitpid(-1*mp, NULL, WNOHANG))>0);
> }

Это не сработает.  После вызова kill/killpg процесс не завершается
немедленно (даже при передаче SIGKILL); задержка определяется
планировщиком и в общем случае непредсказуема.  Нужно либо убирать
WNOHANG, либо ожидать завершения любого процесса (тогда зомби будут
удаляться в следующем цикле).

Просто игнорировать SIGCHLD тут нельзя - если запущенный процесс
завершится раньше вызова stop(), его pid может быть использован
повторно, и тогда сигнал пойдёт совсем не туда, куда ожидалось.  Можно
написать обработчик SIGCHLD, сохраняющий информацию о завершении
запущенных процессов, но тогда в start() и stop() потребуется
аккуратное обращение с sigprocmask().

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: {Spam?} Re: [devel] Просьба потестировать
  2004-03-21 11:48     ` {Spam?} " Sergey Vlasov
@ 2004-03-21 13:13       ` Michael Pozhidaev
  0 siblings, 0 replies; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-21 13:13 UTC (permalink / raw)
  To: ALT Devel discussion list

Sergey Vlasov пишет:
> On Sun, Mar 21, 2004 at 03:03:10PM +0600, Michael Pozhidaev wrote:
> [skip]
> 
>>void stop()
>>{
>>	pid_t p;
>>	killpg(mp, SIGKILL);
>>	while((p = waitpid(-1*mp, NULL, WNOHANG))>0);
>>}
> 
> 
> Это не сработает.  После вызова kill/killpg процесс не завершается
> немедленно (даже при передаче SIGKILL); задержка определяется
> планировщиком и в общем случае непредсказуема.  Нужно либо убирать
> WNOHANG, либо ожидать завершения любого процесса (тогда зомби будут
> удаляться в следующем цикле).
> 
> Просто игнорировать SIGCHLD тут нельзя - если запущенный процесс
> завершится раньше вызова stop(), его pid может быть использован
> повторно, и тогда сигнал пойдёт совсем не туда, куда ожидалось.  Можно
> написать обработчик SIGCHLD, сохраняющий информацию о завершении
> запущенных процессов, но тогда в start() и stop() потребуется
> аккуратное обращение с sigprocmask().
> 
Понятно. Большое спасибо. Уже просто попробовал убрать WNOHANG, и 
программа сделала 1100 порождений процесса, дальше я не стал 
дожидаться. Теперь буду знать.
-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-21  9:03   ` Michael Pozhidaev
  2004-03-21  9:46     ` Andrey Rahmatullin
  2004-03-21 11:48     ` {Spam?} " Sergey Vlasov
@ 2004-03-22  9:22     ` Sergey Pinaev
  2004-03-22 10:58       ` Michael Pozhidaev
  2 siblings, 1 reply; 13+ messages in thread
From: Sergey Pinaev @ 2004-03-22  9:22 UTC (permalink / raw)
  To: ALT Devel discussion list

hi.
On Sun, 21 Mar 2004 15:03:10 +0600
Michael Pozhidaev <msp@altlinux.ru> wrote:

MP> Предыдущее письмо с файлом в рассылку не прошло. Посылаю просто так.

Подозреваю, что это из-за того, что mp у тебя не volatile.

-- 
mail="Sergey Pinaev <dfo@antex.ru>"
url="http://`echo $mail | sed 's/.* <\(.*\)>/\1/' | sed 's/@/./'`"


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-22  9:22     ` Sergey Pinaev
@ 2004-03-22 10:58       ` Michael Pozhidaev
  2004-03-22 11:13         ` Sergey Pinaev
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-22 10:58 UTC (permalink / raw)
  To: ALT Devel discussion list

Sergey Pinaev пишет:
> hi.
> On Sun, 21 Mar 2004 15:03:10 +0600
> Michael Pozhidaev <msp@altlinux.ru> wrote:
> 
> MP> Предыдущее письмо с файлом в рассылку не прошло. Посылаю просто так.
> 
> Подозреваю, что это из-за того, что mp у тебя не volatile.
> 
Можно подробнее, не понял.

-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-22 10:58       ` Michael Pozhidaev
@ 2004-03-22 11:13         ` Sergey Pinaev
  2004-03-22 12:55           ` Michael Pozhidaev
  0 siblings, 1 reply; 13+ messages in thread
From: Sergey Pinaev @ 2004-03-22 11:13 UTC (permalink / raw)
  To: ALT Devel discussion list

hi.
On Mon, 22 Mar 2004 16:58:28 +0600
Michael Pozhidaev <msp@altlinux.ru> wrote:

>> Подозреваю, что это из-за того, что mp у тебя не volatile.
>> 
MP> Можно подробнее, не понял.

Ну у тебя там описано pid_t mp глобально, и ему присваивается
значение в одной функции, а используется в другой.
Правда у тебя функции последовательно вызываются и ситуации,
когда "вторая" вызовется в середине первой не возникнет, так
что это, не причем.
У тебя получается, что play() запускает дитё (mp), которое запускает
дите (pp) и ждет его смерти. А stop() убивает mp и ждет смерти
кого-нибудь с идентификатором группы как у mp. Соответственно,
если в дите (mp) приехал сигнал "умри" он сразу из waitpid()
вывалится, не дожидаясь, пока pp умрет. И pp окажется zombie,
если я все правильно понимаю... =/

-- 
mail="Sergey Pinaev <dfo@antex.ru>"
url="http://`echo $mail | sed 's/.* <\(.*\)>/\1/' | sed 's/@/./'`"


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-22 11:13         ` Sergey Pinaev
@ 2004-03-22 12:55           ` Michael Pozhidaev
  2004-03-22 13:48             ` Sergey Pinaev
  0 siblings, 1 reply; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-22 12:55 UTC (permalink / raw)
  To: ALT Devel discussion list

Sergey Pinaev <dfo@antex.ru> writes:

> hi.
> On Mon, 22 Mar 2004 16:58:28 +0600
> Michael Pozhidaev <msp@altlinux.ru> wrote:
> 
> >> Подозреваю, что это из-за того, что mp у тебя не volatile.
> >> 
> MP> Можно подробнее, не понял.
> 
> Ну у тебя там описано pid_t mp глобально, и ему присваивается
> значение в одной функции, а используется в другой.
> Правда у тебя функции последовательно вызываются и ситуации,
> когда "вторая" вызовется в середине первой не возникнет, так
> что это, не причем.
> У тебя получается, что play() запускает дитё (mp), которое запускает
> дите (pp) и ждет его смерти. А stop() убивает mp и ждет смерти
> кого-нибудь с идентификатором группы как у mp. Соответственно,
> если в дите (mp) приехал сигнал "умри" он сразу из waitpid()
> вывалится, не дожидаясь, пока pp умрет. И pp окажется zombie,
> если я все правильно понимаю... =/
Судя по всему, так и происходит. Я думаю избавиться от этого путём убирания WNOHANG из вызова waitpid().

-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-22 12:55           ` Michael Pozhidaev
@ 2004-03-22 13:48             ` Sergey Pinaev
  2004-03-22 14:18               ` Michael Pozhidaev
  0 siblings, 1 reply; 13+ messages in thread
From: Sergey Pinaev @ 2004-03-22 13:48 UTC (permalink / raw)
  To: ALT Devel discussion list

hi.
On 22 Mar 2004 18:55:18 +0600
Michael Pozhidaev <msp@altlinux.ru> wrote:

MP> Судя по всему, так и происходит. Я думаю избавиться от этого путём
MP> убирания WNOHANG из вызова waitpid().

А зачем тебе два форка?

-- 
mail="Sergey Pinaev <dfo@antex.ru>"
url="http://`echo $mail | sed 's/.* <\(.*\)>/\1/' | sed 's/@/./'`"


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [devel] Просьба потестировать
  2004-03-22 13:48             ` Sergey Pinaev
@ 2004-03-22 14:18               ` Michael Pozhidaev
  0 siblings, 0 replies; 13+ messages in thread
From: Michael Pozhidaev @ 2004-03-22 14:18 UTC (permalink / raw)
  To: ALT Devel discussion list

Sergey Pinaev <dfo@antex.ru> writes:

> hi.
> On 22 Mar 2004 18:55:18 +0600
> Michael Pozhidaev <msp@altlinux.ru> wrote:
> 
> MP> Судя по всему, так и происходит. Я думаю избавиться от этого путём
> MP> убирания WNOHANG из вызова waitpid().
> 
> А зачем тебе два форка?
Это был простой пример программы, где звук не только проигрывался, а ещё и генерировался, для последующей посылки через трубу для воспроизведения. Воспроизведение нужно уметь останавливать, поэтому я использовал процессные группы для коллективной посылки SIGKILL.
> 
> -- 
> mail="Sergey Pinaev <dfo@antex.ru>"
> url="http://`echo $mail | sed 's/.* <\(.*\)>/\1/' | sed 's/@/./'`"
> _______________________________________________
> Devel mailing list
> Devel@altlinux.ru
> http://www.altlinux.ru/mailman/listinfo/devel
> 

-- 
Best wishes. Michael Pozhidaev. E-mail: msp@altlinux.ru.
Tomsk state university.
Computer science department. (http://www.inf.tsu.ru)


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2004-03-22 14:18 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-03-21  7:20 [devel] Просьба потестировать Michael Pozhidaev
2004-03-21  8:24 ` Andrey Rahmatullin
2004-03-21  9:03   ` Michael Pozhidaev
2004-03-21  9:46     ` Andrey Rahmatullin
2004-03-21 10:14       ` Michael Pozhidaev
2004-03-21 11:48     ` {Spam?} " Sergey Vlasov
2004-03-21 13:13       ` Michael Pozhidaev
2004-03-22  9:22     ` Sergey Pinaev
2004-03-22 10:58       ` Michael Pozhidaev
2004-03-22 11:13         ` Sergey Pinaev
2004-03-22 12:55           ` Michael Pozhidaev
2004-03-22 13:48             ` Sergey Pinaev
2004-03-22 14:18               ` Michael Pozhidaev

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git