Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замещение родительского процесса дочерним 
V
    Опции темы
feodorv
Дата 23.12.2012, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(boostcoder @  23.12.2012,  00:27 Найти цитируемый пост)
как я понял, семейство функций exec*() работает не так как в POSIX, хотя именно для этого эти функции и предоставляются msvcrt.dll.

Многое не работает как в POSIX, а msvcrt.dll - это только лишь майкросовтовская реализация стандартной библиотеки, насколько можно приближенная к POSIX, но в общем и целом стандарту не соответствующая. Но! Майкрософт разработала специальную подсистему POSIX, в которой реализован стандарт, но в которой уже недоступны родные вызовы WinAPI.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
boostcoder
Дата 23.12.2012, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(feodorv @  23.12.2012,  00:08 Найти цитируемый пост)
Но! Майкрософт разработала специальную подсистему POSIX, в которой реализован стандарт, но в которой уже недоступны родные вызовы WinAPI.

это что?

PM WWW   Вверх
volatile
Дата 23.12.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Два раза прочитал, так и не понял, что нужно...
1.
Цитата(alexx83 @  20.12.2012,  21:45 Найти цитируемый пост)
Необходимо в идеальном случае замещать родительский процесс дочерним с сохранением взаимодействия с консолью в дочернем процессе

То есть родитель вам больше не нужен. и он может благополучно завершиться, оставив работать дочерний?
2.
Цитата(alexx83 @  21.12.2012,  19:45 Найти цитируемый пост)
нужно чтобы процессы умирали синхронно.

мысль, перпендикулярная первой smile 

Нужно чтобы висели оба, причем родитель, исключительно для того чтоы при прибивании его, прибивался и дочерний?
(больше от него проку то нет, все его функции замещены дочерним.)
Цитата(alexx83 @  20.12.2012,  21:45 Найти цитируемый пост)
Необходимо в идеальном случае замещать родительский процесс дочерним


Сформулируйте задачу четко. Тогда может и сами решите.
А пока не сформулируете чётко, ее никто не решит. (и посикс тут не причем)


Это сообщение отредактировал(а) volatile - 23.12.2012, 00:25
PM MAIL   Вверх
feodorv
Дата 23.12.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(volatile @  23.12.2012,  01:23 Найти цитируемый пост)
Сформулируйте задачу четко.

Нет, нет, всё понятно. Просто пытались рассмотреть разные возможности, поэтому такие несоответствия... Но всё неудачно  smile Я всё больше склоняюсь к мысли, что запускаемый экзешник - хитроватый...


Цитата(alexx83 @  22.12.2012,  09:57 Найти цитируемый пост)
Результат такой же как и без заполнения

А если всё таки запускать gdb (или что там) через bat-файл, в котором и выставлять нужные переменные окружения?


Цитата(boostcoder @  23.12.2012,  01:14 Найти цитируемый пост)
это что?

Вот это smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 23.12.2012, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(feodorv @  23.12.2012,  00:38 Найти цитируемый пост)
Нет, нет, всё понятно.

Ну раз все понятно, тогда видимо я недостаточно сообразителен.
Посему, удаляюсь...

ЗЫ: Хочу сказать только, что если первое, то делал неоднократно, и все прекрасно работало.
Если второе не делал, потому как бессмысленно, но уверен что и это сделать можно.

PM MAIL   Вверх
boostcoder
Дата 23.12.2012, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(feodorv @  23.12.2012,  00:38 Найти цитируемый пост)
Я всё больше склоняюсь к мысли, что запускаемый экзешник - хитроватый.

ну... я хз что в нем хитрого..gdb как gdb.

Цитата(feodorv @  23.12.2012,  00:38 Найти цитируемый пост)
А если всё таки запускать gdb (или что там) через bat-файл, в котором и выставлять нужные переменные окружения?

нужно попробовать.

Цитата(volatile @  23.12.2012,  00:48 Найти цитируемый пост)
Хочу сказать только, что если первое, то делал неоднократно

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

Добавлено через 9 минут и 35 секунд
Цитата(feodorv @  23.12.2012,  00:38 Найти цитируемый пост)
Вот это

я вот только не понял, начиная с какой версии вендус предоставляется это?

PM WWW   Вверх
volatile
Дата 23.12.2012, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(boostcoder @  23.12.2012,  01:02 Найти цитируемый пост)
 вендус, вообще невозможно заменить родительский процесс дочерним

boostcoder, я щас скомпилил тот код что приведен в этой теме.
в этом посте:
Цитата(alexx83 @  21.12.2012,  20:27 Найти цитируемый пост)
...
То получаю такой же результат как при использовании _execvpe, т.е. могу ввести только одну команду в консоли дочернему процессу и он отрубается от консоли 


У меня так:
Ззапускается родитель.
затем он запускает дочерний.
затем родитель завершается.
дочерний остается с той консолью, что была у родителя и полноценно работает и на ввод и на вывод.
Все пашет.

А вот зачем это
Цитата(alexx83 @  21.12.2012,  19:45 Найти цитируемый пост)
нужно чтобы процессы умирали синхронно.

мне не понять... smile 
PM MAIL   Вверх
feodorv
Дата 23.12.2012, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(volatile @  23.12.2012,  01:48 Найти цитируемый пост)
тогда видимо я недостаточно сообразителен.

Это вряд ли smile 


Цитата(volatile @  23.12.2012,  01:48 Найти цитируемый пост)
Посему, удаляюсь...

Вот этого не хотелось бы... Как раз хотелось бы Вашего участия...


Цитата(volatile @  23.12.2012,  01:48 Найти цитируемый пост)
ЗЫ: Хочу сказать только, что если первое, то делал неоднократно, и все прекрасно работало.

Так и я о том же... Что-то здесь не так  smile 


Цитата(boostcoder @  23.12.2012,  02:02 Найти цитируемый пост)
ну... я хз что в нем хитрого..gdb как gdb.

Как я понимаю всё же, gdb скомпилён в GNU окружении, эмулирующем поведение UNIX. И как там сказывается эта эмуляция - я хз)))


Цитата(boostcoder @  23.12.2012,  02:02 Найти цитируемый пост)
я вот только не понял, начиная с какой версии вендус предоставляется это?

Как раз начиная с NT, какое-то там военное ведомство отказалось сертифицировать Windows NT без надлежащей поддержки POSIX. Изначально был реализован POSIX.1, сейчас число вызовов расширено (то ли 2000, то ли 3000 штук), но всё равно работа возможна только в текстовом режиме.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 23.12.2012, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



В father.exe нажимаем 'f', запускается son.exe, father.exe завершаецца.
Для выхода нажимаем точку "."

father.exe
Код

#include <iostream>

void help ()
{
   std::cout << "The father ver. 1.0%s (c) xx 2012\n\n";
}

// ----------------------------------------------------------------------------------------------------------
void fork2 ()
{
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   
   memset(&si, 0, sizeof(si));
   si.cb = sizeof(si);
   memset(&pi, 0, sizeof(pi));

   char * cmdbuf = "son.exe";
   
   CreateProcess(
       0    // exe name
       ,cmdbuf    // command line
       ,0            // process security attributes
       ,0            // primary thread security attributes
       ,0           // handles are NOT inherited
       ,0            // creation flags
       ,0            // use parent's environment
       ,0            // use parent's current directory
       ,&si        // STARTUPINFO pointer
       ,&pi        // receives PROCESS_INFORMATION
   );
       
   WaitForInputIdle(pi.hProcess, INFINITE);
       
   // free(envbuf);
   // free(resbuf);
   // free(cmdbuf);
}



// ----------------------------------------------------------------------------------------------------------
int _main ()
{
   help ();
   for (;;)
   {
       std::cout <<  "father :";
       std::string s;
       getline (std::cin, s);
       if (s == ".")
       {
          break;
       }
       if (s == "f")
       {
          fork2 ();
          break;
       }
   } 
   std::cout << ("father : --- goob bye. ---\n");
   return 0;
}

// ----------------------------------------------------------------------------------------------------------


int _tmain (int argc, tch * argv[])
{
   int ret;
   ret = _main ();
   return ret;
}


son.exe
Код

#include <iostream>

void help ()
{
   std::cout << "The son ver. 1.0%s (c) xx 2012\n\n";
}

// ----------------------------------------------------------------------------------------------------------

int _main ()
{
   help ();
   for (;;)
   {
       std::cout << "   son :";
       std::string s;
       getline (std::cin, s);
       if (s == ".")
       {
          break;
       }
   } 
   std::cout << ("   son : --- goob bye. ---\n");
   return 0;
}

// ----------------------------------------------------------------------------------------------------------


int _tmain (int argc, tch * argv[])
{
   int ret;
   ret = _main ();
   return ret;
}

user posted image

Добавлено через 1 минуту и 41 секунду
езешники father.exe, son.exe
положить в одну папку.


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  exe_s.7z 51,93 Kb
PM MAIL   Вверх
boostcoder
Дата 23.12.2012, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(volatile @  23.12.2012,  01:18 Найти цитируемый пост)
Ззапускается родитель.
затем он запускает дочерний.
затем родитель завершается.
дочерний остается с той консолью, что была у родителя и полноценно работает и на ввод и на вывод.

я размышляю привычными для меня терминами.
в линукс, замещение процесса означает, загрузку другого процесса в адресное пространство первого. то, что описал ты, дает почти тот же результат. (я не говорю про наследование UID и GID)

Цитата(volatile @  23.12.2012,  01:18 Найти цитируемый пост)
А вот зачем это
Цитата(alexx83 @  21.12.2012,  19:45 )
нужно чтобы процессы умирали синхронно.

мне не понять...

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

Цитата(feodorv @  23.12.2012,  01:25 Найти цитируемый пост)
gdb скомпилён в GNU окружении, эмулирующем поведение UNIX.

нет. gdb умеет работать в нативной вендус среде.

Цитата(feodorv @  23.12.2012,  01:25 Найти цитируемый пост)
Как раз начиная с NT, какое-то там военное ведомство отказалось сертифицировать Windows NT без надлежащей поддержки POSIX. Изначально был реализован POSIX.1, сейчас число вызовов расширено (то ли 2000, то ли 3000 штук), но всё равно работа возможна только в текстовом режиме.

странно...впервые вообще слышу о такой штуковине. посмотрел экспорт dll`ки - да, экспортируются POSIX функции.

Добавлено через 3 минуты и 44 секунды
volatile, спасибо. завтра буду проверять.
что-то уже и я запутался smile

Добавлено через 7 минут и 16 секунд
кто-то может подсказать, существуют ли вообще в открытом доступе исходники этой psxdll.dll?

PM WWW   Вверх
volatile
Дата 23.12.2012, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(boostcoder @  23.12.2012,  01:50 Найти цитируемый пост)
загрузку другого процесса в адресное пространство первого.

так... этого в теме еще не было...
В таком случае это еще и 3 альтернатива, того что нужно ТС... smile

Имхо, здесь каждый говорит о своем, потому-что
Цитата(volatile @  23.12.2012,  00:23 Найти цитируемый пост)
Сформулируйте задачу четко. Тогда может и сами решите.
А пока не сформулируете чётко, ее никто не решит. (и посикс тут не причем)


PM MAIL   Вверх
boostcoder
Дата 23.12.2012, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



ладно, пусть сформулирует...
PM WWW   Вверх
alexx83
Дата 23.12.2012, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.3.2010

Репутация: нет
Всего: 1



Спасибо что присоединились к этой теме volatile.

Цитата(volatile @  23.12.2012,  00:23 Найти цитируемый пост)
Сформулируйте задачу четко. Тогда может и сами решите.
А пока не сформулируете чётко, ее никто не решит. (и посикс тут не причем)

Задача проста: пишется враппер к gdb. Задача враппера изменить переменные среды и запустить gdb так чтобы он оставался привязанным к консоли в которой запущен враппер. Первый вариант - при этом враппер нам больше не нужен и он должен быть уничтожен. Второй вариант (если враппер не может быть уничтожен) - при завершении враппера должен завершаться и сам gdb.
Для примера, вы работаете в IDE и запускаете приложение на отладку. Вместо самого gdb сначала запускается враппер который потом запускает gdb. IDE ничего не знает о враппере.
По поводу вашего примера volatile. У меня от не работает как у вас на картинке smile Получаю следующее:
Код

C:\SDK\msys\toolchains\mingw64\bin>father
The father ver. 1.0%s (c) xx 2012

father :err
father :reee
father :ffddsds
father :
father :fdgrfgr
father :f
father : T-h-e-  sgoono bv ebry.e .1 .-0-%-s
 (c) xx 2012

   son :
C:\SDK\msys\toolchains\mingw64\bin>ff
   son :f
"f" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\SDK\msys\toolchains\mingw64\bin>frfr
   son :
C:\SDK\msys\toolchains\mingw64\bin>frr
   son :frfr
"frfr" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\SDK\msys\toolchains\mingw64\bin>
   son :
C:\SDK\msys\toolchains\mingw64\bin>frfr
   son :.
"." не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\SDK\msys\toolchains\mingw64\bin>.
   son : --- goob bye. ---

Может это глюк винды?
PM MAIL   Вверх
volatile
Дата 23.12.2012, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(alexx83 @  23.12.2012,  08:59 Найти цитируемый пост)
 У меня от не работает как у вас на картинке

Естественно. Это же ваш код, взятый в этой теме.
Я просто взял ваш код и показал что у меня он работает. 

alexx83, понятно, я попробую воссоздать баг, если удастся конечно. (я не пользуюсь gdb).

По крайней мере, проблема прояснилась.

PM MAIL   Вверх
boostcoder
Дата 23.12.2012, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



volatile, вот как у меня работают тобою предкомпилированные екзешники:
user posted image

Добавлено через 11 минут и 7 секунд
win7, 64-bit.

Добавлено через 13 минут и 24 секунды
по выводу видно, что sun.exe запускается как отдельно введенная команда, а значит наследование дескрипторов не происходит.

PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1506 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.