On Tue, 8 Jan 2002, Elena Egorova wrote:

 Здравствуйте,

> Здравствуйте,
> 
> Может быть, это проблема perl? Так как у меня действительно получается
> чушь в файле environ, если я использую перловский скрипт, но все нормально,
> если я делаю то же самое на C. Вот пример:
> #include <unistd.h>
> #include <string.h>
> #include <stdio.h>
> 
> int main(int argc, char **argv){
>               int pid;
>               pid=(int)getpid();
>               printf("%d\n\n", (int)pid);
>               strcpy(argv[0], "something");
>               sleep(300);
>               return 0;
> }
> Я не очень хорошо знаю перл, может быть, это и не правильный аналог скрипта?

 Нет, Ваш С-аналог - некорректен. В perl $0 - это имя, под которым показывают
данный процесс программы типа top и ps (очень полезная вещь для мониторинга
состояния всяких демонов, а также чтобы делать killall для всех демонов в
одном состоянии и пр.) (эта практика используется и sendmail'ом тоже - он
меняет имя в соответствии с тем, чем сейчас занимается когда он чем-то
действительно занимается). В С присвоение значения argv[0] естественно не
изменит имя (и вообще, не известен размер буфера указываемого argv[0] - просто
так туда копировать - опасно), под которым процесс показывается ps и top - для
того, чтобы добиться того же эффекта, что и присвоение $0 в перле, в С-шном
аналоге надо вызвать какие-то системно-зависимые и малодокументированные (и
естественно непортабельные на другие юниксы) функции.

 Best regards,
  -Vlad

> On Tue, Jan 08, 2002 at 02:32:58PM +0400, Vlad Harchev wrote:
> 
> >  Я поковырялся еще - да, у меня тоже для большинства процессов
> > /proc/ANYPID/environ содержит правильные данные. Но если процесс - это
> > интепретатор перл, исполняющий скрипт который пррисваивает $0 чего-то - то 
> > для
> > этого процесса /proc/ITSPID/environ будет содержать только пробелы.
> >  Такое же поведение имеют и ядро 2.2.18, стоящее у меня на др. машине.
> > Короче, это ошибка в ядре.
> 
> --
> Elena Egorova
> 


Ответить