[cdev] исправление find

Grigoriy A. Sitkarev sitkarev на komitex.ru
Вт Мар 16 20:33:51 MSK 2010


Много замечаний конечно.

Пока что самые основные, всё остальное я думаю вы сами увидите и 
исправите после того как начнёт более-менее работать ваша программа.

1. После скобок, завершающих тело функции, точку с запятой не надо 
ставить. Она там лишняя.

Аргументы функции должны быть разделены пробелами. Пробелы должны быть и 
  после операторов +,-,=,!=,== и т.д. Вы посмотрите ещё раз LKCS, там 
много примеров, всё же понятно должно быть. Секция 3.1 как раз говорит 
про пробелы.

2. Имена в верхнем регистре принято использовать для макросов, 
переменных с такими именами желательно избегать.

3. Функцию xstrcpy надо убрать и заменить на xstrdup тогда. Что-то в 
таком духе должно быть, проверите как работает.

char *
xstrdup(const char *str)
{
	char *rs;
	size_t len;

	len = strlen(str);

	rs = malloc(len+1);

	if (rs == NULL) {
		fprintf(stderr, "xstrdup: out of memory\n");
		exit(1);
	}

	memcpy(rs, str, len);
	rs[len] = 0;

	return rs;
}

4. Вы не понимаете смысла модификатора extern. Он нужен если переменная, 
которую вы хотите использовать, объявлена в другом файле. В вашем случае 
его использовать не нужно. Перечитайте пожалуйста в литературе по языку 
Си про extern подробнее.

5. С getcwd(3) думаю можно обойтись так. Вам это проверить тоже надо.

char *
xgetcwd(void)
{
#define CWD_GROW_UP 32
	size_t len;
	char *rs, *s;

	len = 0;

	do {
		rs = realloc(rs, len+CWD_GROW_UP);
		if (rs == NULL) {
			fprintf(stderr, "xgetcwd: out of memory\n");
			exit(1);
		}
		len += CWD_GROW_UP;
		s = getcwd(rs, len);
	} while ((s == NULL) && (errno == ERANGE));

	if (s == NULL) {
		fprintf(stderr, "xgetcwd: can't get current dir: %s\n",
				strerror(errno));
		exit(1);
	}

	return rs;
}

6. Вам надо сделать конечно чтобы в нескольких каталогах можно было 
делать поиск и -exec бы надо приделать тоже. Начните с первого пока. 
Кроме того, шаблон, по которому задаётся поиск, это аргумент операнда 
-name. У вас его вообще нет.

7. Почему вы решили что именно lstat(2) тормозит?

8. По поводу проверки ошибок системных вызовов, в каждой man-странице к 
системному вызову есть секция ERRORS. При ошибке системные вызова 
возвращают -1 и устанавливают переменную errno. Прочтите errno(3) и 
strerror(3) также.

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

Что-то ещё вспомню - напишу.

lenad89 пишет:
> Вот код.
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> cdev mailing list
> cdev на wiki.syktsu.ru
> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev





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