Добрый день,
как можно под unix породить процесс с заданным именем,
например: имеем ветвящийся сервер, который на каждое новое подключение форкает новый процесс; как задать имя этого нового процесса (напр., в зависимости от того, кто коннектиться)?Спасибо заранее.
>Добрый день,
>как можно под unix породить процесс с заданным именем,
>например: имеем ветвящийся сервер, который на каждое новое подключение форкает новый процесс;
>как задать имя этого нового процесса (напр., в зависимости от того,
>кто коннектиться)?через fork() - никак.
через exec - это уже не fork().// wbr
>через fork() - никак.
>через exec - это уже не fork().
>
>// wbrок, а если через exec? Можно ли запускать новый процесс, задавать ему имя и передавать дескриптор подключенного сокета?
или какие ещё есть варианты?
(факт то, что это реализуемо)
>
>>через fork() - никак.
>>через exec - это уже не fork().
>>
>>// wbr
>
>ок, а если через exec? Можно ли запускать новый процесс, задавать ему
>имя и передавать дескриптор подключенного сокета?
>
>или какие ещё есть варианты?
>(факт то, что это реализуемо)
универсального способа НЕТ, но в некоторых системах катит просто перезапись argv[0], чтобы переименовать текущую задачу :
int main(int argc,char *argv[]) {
snprintf(argv[0],strlen(argv[0]),"another name");
...
}
>>
>>>через 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
>>>
>>>>через 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
>Добрый день,
>как можно под unix породить процесс с заданным именем,
>например: имеем ветвящийся сервер, который на каждое новое подключение форкает новый процесс;
>как задать имя этого нового процесса (напр., в зависимости от того,
>кто коннектиться)?
>
>Спасибо заранее.А что такое имя процесса? =)
Например, для Linux:
Есть, к примеру, comm, который определяется из имени запускаемого бинарника и не может быть изменен со временем.
Есть argv[0], который лежит в конце адресного пр-ва процесса и легально его изменить можно только если длина нового имени короче старого (иначе - только с перезаписью других аргументов и, возможно, environment).
ps может показывать и comm и argv[0] (зависит от ключей).