URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3449
[ Назад ]

Исходное сообщение
"порождение процесса с заданным именем (С/С++/Perl)"

Отправлено AT , 05-Окт-04 12:09 
Добрый день,
как можно под unix породить процесс с заданным именем,
например: имеем ветвящийся сервер, который на каждое новое подключение форкает новый процесс; как задать имя этого нового процесса (напр., в зависимости от того, кто коннектиться)?

Спасибо заранее.


Содержание

Сообщения в этом обсуждении
"порождение процесса с заданным именем (С/С++/Perl)"
Отправлено klalafuda , 05-Окт-04 12:19 
>Добрый день,
>как можно под unix породить процесс с заданным именем,
>например: имеем ветвящийся сервер, который на каждое новое подключение форкает новый процесс;
>как задать имя этого нового процесса (напр., в зависимости от того,
>кто коннектиться)?

через fork() - никак.
через exec - это уже не fork().

// wbr


"порождение процесса с заданным именем (С/С++/Perl)"
Отправлено AT , 05-Окт-04 12:30 

>через fork() - никак.
>через exec - это уже не fork().
>
>// wbr

ок, а если через exec? Можно ли запускать новый процесс, задавать ему имя и передавать дескриптор подключенного сокета?

или какие ещё есть варианты?
(факт то, что это реализуемо)


"порождение процесса с заданным именем (С/С++/Perl)"
Отправлено MaximKuznetsov , 05-Окт-04 13:02 
>
>>через fork() - никак.
>>через exec - это уже не fork().
>>
>>// wbr
>
>ок, а если через exec? Можно ли запускать новый процесс, задавать ему
>имя и передавать дескриптор подключенного сокета?
>
>или какие ещё есть варианты?
>(факт то, что это реализуемо)
универсального способа НЕТ, но в некоторых системах катит просто перезапись argv[0], чтобы переименовать текущую задачу :
int main(int argc,char *argv[]) {
  snprintf(argv[0],strlen(argv[0]),"another name");
...
}



"порождение процесса с заданным именем (С/С++/Perl)"
Отправлено klalafuda , 05-Окт-04 14:01 
>>
>>>через fork() - никак.
>>>через exec - это уже не fork().
>>>
>>>// wbr
>>
>>ок, а если через exec? Можно ли запускать новый процесс, задавать ему
>>имя и передавать дескриптор подключенного сокета?
>>
>>или какие ещё есть варианты?
>>(факт то, что это реализуемо)
>универсального способа НЕТ, но в некоторых системах катит просто перезапись argv[0], чтобы
>переименовать текущую задачу :
>int main(int argc,char *argv[]) {
>  snprintf(argv[0],strlen(argv[0]),"another name");
>...
>}

heh.. на BSD это работает, но отчасти :)

---cut---
int
main(int argc, char *argv[])
{
    snprintf(argv[0], strlen(argv[0]), "xxx");
---cut---

$ ./server | tee ior
$ ps
  PID TT STAT    TIME COMMAND
3373 p0 S+   0:00.05 xxx (server)

ps: но я бы не стал особо надеяться на стабильность такого поведения..

// wbr


"порождение процесса с заданным именем (С/С++/Perl)"
Отправлено chip , 09-Окт-04 00:34 
>>>
>>>>через fork() - никак.
>>>>через exec - это уже не fork().
>>>>
>>>>// wbr
>>>
>>>ок, а если через exec? Можно ли запускать новый процесс, задавать ему
>>>имя и передавать дескриптор подключенного сокета?
>>>
>>>или какие ещё есть варианты?
>>>(факт то, что это реализуемо)
>>универсального способа НЕТ, но в некоторых системах катит просто перезапись argv[0], чтобы
>>переименовать текущую задачу :
>>int main(int argc,char *argv[]) {
>>  snprintf(argv[0],strlen(argv[0]),"another name");
>>...
>>}
>
>heh.. на BSD это работает, но отчасти :)

man 3 setproctitle


"порождение процесса с заданным именем (С/С++/Perl)"
Отправлено Murr , 09-Окт-04 10:42 
>Добрый день,
>как можно под unix породить процесс с заданным именем,
>например: имеем ветвящийся сервер, который на каждое новое подключение форкает новый процесс;
>как задать имя этого нового процесса (напр., в зависимости от того,
>кто коннектиться)?
>
>Спасибо заранее.

А что такое имя процесса? =)

Например, для Linux:

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

Есть argv[0], который лежит в конце адресного пр-ва процесса и легально его изменить можно только если длина нового имени короче старого (иначе - только с перезаписью других аргументов и, возможно, environment).

ps может показывать и comm и argv[0] (зависит от ключей).