LINUX.ORG.RU

Переменные окружения. Как избавиться?


0

0

Переменные окружения. Как избавиться?

язык СИ
ОС UNIX

Имеется сервер (самодельный).
При переносе на другую машину возникла трудность.
(FreeBSD 6.3-RC2 --> FreeBSD 7.2-RELEASE (GENERIC))

Требуется избавиться от переменных окружения
для того, что бы сформировать новые и передать их
execl-ом другим программам.
Использую функции
void unsetenv(const char *name);
int setenv(const char *имя, const char *значение, int overwrite);


Фрагмент кода:

//--- очищаем переменные окружения ---
n=0;
while(envp[0]!=NULL && n<50){
strncpy(buf,envp[0],sizeof(buf));
j=0;
while(buf[j]!=0 && buf[j]!='='){ j++;}
buf[j]=0;
unsetenv(buf);
//printf(«unsetenv(%s)\n»,buf);
n++;
}

...

//--- новые переменные окружения ---
n=setenv(«REMOTE_ADDR»,ip,1);
n=setenv(«REMOTE_PORT»,port,1);

Конец фрагмента.


На другой машине функция
unsetenv();
не срабатывает, и новые переменные окружения
добавляются к старым.

В чём тут дело?

Кто знает прошу ответить.


>Требуется избавиться от переменных окружения
для того, что бы сформировать новые и передать их
execl-ом другим программам.


Не силён в окружении, и не знаю, правильно я понял, но кажется вам нужно изменить значения существующих? setenv вроде бы.

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

Нет.
От них нужно совсем избавиться
в начальной (не цикловой) части программы.

Имена их отличаются от тех, которые нужны.
И setenv() добавляет эти новые, но и старые
остаются.

oleg_2
() автор топика

вообще-то unsetenv() возвращает int — код ошибки. Проверьте, что она действительно правильно сработала. А ошибку можно узнать с помощью perror().

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

«Prior to glibc 2.2.2, unsetenv() was prototyped as returning void; more recent glibc versions follow the POSIX.1-2001-compliant prototype shown in the SYNOPSIS.»

GArik ★★★
()

а execle() вам не подойдет?

int execle(const char *path, const char *arg, ..., char * const envp[]);

The execle() function also specifies the environment of the executed process by following the
NULL pointer that terminates the list of arguments in the argument list or the pointer to the
argv array with an additional argument. This additional argument is an array of pointers to
null-terminated strings and must be terminated by a NULL pointer. The other functions take
the environment for the new process image from the external variable environ in the current
process.

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

execl()
не понял, где его применить?
Он ведь передаст все переменные окружения,
а если указать NULL, то мне новые переменные
некуда будет писать.
В этом смысле он похож на
int main(int argc, char *argv[], char * envp[])


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

cоздаете новый

char **newenv;

заселяете его очищенным от мусора окружением из **environ,
запускаете child process через execle()

Sylvia ★★★★★
()
#include <stdlib.h>
int main(int ac, char *av[], char **envp)
{
	char buf[64];
	while(envp[0]!=NULL){
		strncpy(buf,envp[0],sizeof(buf));
		int j=0;
		while(buf[j]!=0 && buf[j]!='='){ j++;}
		buf[j]=0;
		unsetenv(buf);
	}
	execl("/usr/bin/env", "env", 0);
	return 1;
}

./a.out | wc -l
0

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

Silvy посоветовал самодельный массив

char **newenv;

Я сделал так:

char *newenv[15];

...

environ = newenv;
execl(fname,NULL,environ);

Да.
Это работает.
Спасибо.

Непонятно только почему штатная функция
не работает.

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

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

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

Я посмотрю, какое окружение дает настоящий
фирменный сервер запускаемым программам и
подберу оптимальный набор.

спасибо.

oleg_2
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.