[cdev] Утилита ps

Grigoriy A. Sitkarev sitkarev на komitex.ru
Чт Мар 18 23:17:04 MSK 2010


Стас и Ксюша,

я вижу что вы что-то пытаетесь написать, но у вас тут почему-то очень 
много кода который к ps никакого отношения не имеет. Это помоему реликт 
вашей предыдущей работы - вы тренировались сделать простой вариант ls(1).

Если я правильно понимаю, то ваши усилия это пока тренировка, проба сил 
так сказать, после чего вы начнёте уже делать то что по спецификации.

Просматривая ваш код я заметил следующее:

1. Чтобы проверить является ли каталог числом, можно поступить гораздо 
проще чем у вас. Ваша функция (очевидно, повзаимствованная и я даже знаю 
у кого) numericproc очень громоздка для своей задачи. На вскидку есть 
два варианта как её решить (гораздо проще).

int
dir_is_proc(const char *dname)
{
	if (dname == NULL || *dname == 0)
		return 0;

	while (isdigit(*dname))
		++dname;

	return (*dname == 0);
}

Здесь isdigit(3) можно заменить на:


	while (*dname >= '0' && *dname <= '9')


Есть также вариант с использованием функции strtoul(3). С её помощью вы 
можете и проверить что каталог - число, и сразу же сконвертировать в 
номер процесса:

pid_t
get_pid_from_dir(const char *dname)
{
	pid_t res;
	char *endp;

	if (dname == NULL || *dname == 0)
		return -1;

	res = strtoul(dname, &endp, 10);

	return (*endp == 0 ? res : -1);
}


(Все эти функции проверите)

2. У вас не правильно выделяется память. Вы это делаете так:

char *ss = malloc(*ss);

И допускаете две ошибки. Во-первых, не проверяете, что вернул malloc(3), 
  во-вторых, *ss переданное в malloc будет мусором - первым байтом 
массива, который никуда не указывает. Вам там нужен размер в байтах. Так 
что уже когда вы читаете через fread(3) у вас уже память попорчена. Вам 
  надо просто сделать статический буфер и читать туда, на мой взгляд 
выделять память динамически не нужно.

Обратите внимание что ниже точно такая же ошибка.

3. Нигде не проверяете что вернули вам вызовы, например fopen(3) но я 
надеюсь что это вы пока только экспериментируете, и исправите, напишете 
обработчик и т.д.

Продолжайте трудиться.

--
Г.А.

Malkov Stanislav пишет:
> Здравствуйте.
> 
> Отправляем код ps на данный момент.
> 
> --
> Кимаск К., Малков С.
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> cdev mailing list
> cdev на wiki.syktsu.ru
> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev





Подробная информация о списке рассылки cdev