Эквивалент Windows для экрана Linux или другая альтернатива?

Я ищу способ управления программами в среде Windows.

Я бы предпочел, чтобы это было немного похоже на программное обеспечение Linux "screen".

Причина моего поиска в том, что мне нужно запустить программу (в Windows) с идентификатором, чтобы позже я мог закрыть эту конкретную программу, не закрывая ничего другого, даже если реальная программа (файл .exe) запущена многократно. Так я могу в любом случае "назвать" его?

Я использую следующее в Linux сейчас:

$ screen <params> <id> ./softwareprogram

И тогда я знаю, что всегда могу найти его по его идентификатору :)

Это внешняя программа, которая закрывает или запускает стороннюю программу.

Моя программа написана на C++, если это имеет значение.

Изменить: я не могу никоим образом не выбирать идентификатор самостоятельно? Как запустить программу с определенным именем? Также как мне убить процесс, указав имя?


person Community    schedule 19.02.2011    source источник
comment
@Christian и @CodeInChaos; это кажется очень сложным. Также, если я запускаю его с помощью функции CreateProcess, умирает ли запущенная программа, когда я закрываю свою программу (или происходит сбой). @Christian Я хотел бы сам присвоить имя. Программа, над которой я работаю, никому не известна, так что будет трудно понять, кто есть кто. Название происходит от TCP-соединения с чужой машины с собственной базой данных (база данных недоступна для моей программы). Таким образом, он в основном отправляет команду stop:program588, а затем я хочу, чтобы моя программа остановила программу с идентификатором program588. Эту функциональность очень легко получить с помощью   -  person    schedule 20.02.2011


Ответы (3)


На данный момент я не верю, что для экрана существует нативный эквивалент. Cygwin содержит реализацию screen, но имеет накладные расходы по сравнению с cygwin. Проблема в том, что операционные системы на базе Windows и Posix реализуют консоли совершенно по-разному. Windows не поддерживает многие функции tty, являющиеся частью среды POSIX. При этом возможно написать минимальную реализацию функциональности утилиты screen с использованием вызовов API: AttachConsole и FreeConsole. Тем не менее, я должен был бы сделать немного больше исследований по этому вопросу.

person Charles Grunwald    schedule 15.01.2012

Когда вы запускаете программу, вы можете получить ее идентификатор процесса даже в Windows. Позже вы можете использовать этот идентификатор процесса, чтобы снова убить программу.

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

Вместо реестра вы, конечно, можете использовать базу данных или папку с файлами, где ключ (ваш идентификатор) - это имя файла, а pid находится внутри каждого файла.

person Christian    schedule 19.02.2011
comment
Лучше использовать дескриптор — идентификаторы процессов можно использовать повторно, а дескриптор никогда не будет использоваться повторно, пока вы его не закроете. И не помещайте в реестр данные, которым даже не нужна перезагрузка ಠ_ಠ - person bdonlan; 15.01.2012

Хотя я понятия не имею, что делает команда linux screen, почему бы вам просто не использовать дескриптор процесса, полученный от CreateProcess?

Вы также получаете идентификатор процесса, но он действителен только до тех пор, пока для этого процесса есть открытые дескрипторы.

Параметр lpProcessInformation будет содержать как идентификатор процесса, так и дескриптор процесса.

person CodesInChaos    schedule 19.02.2011
comment
Это, вероятно, лучший вариант, который вы можете сделать прямо сейчас в Windows с помощью PowerShell, спасибо, что немного озадачили меня. - person ZaxLofful; 04.08.2018