Я согласен с @Aaron, но если вы все еще хотите точно sed
, посмотрите на это:
$ cat /tmp/del.txt
void some_function_declaration(char var1, char var2)
{
...
}
void enother_function_declaration(char var1, char var2)
{
...
}
И применяя sed
:
$ cat /tmp/del.txt | sed ':a;N;$!ba;s/)\n{/)\{\ntime_exe(__func__, cl(clock()));/g'
void some_function_declaration(char var1, char var2){
time_exe(__func__, cl(clock()));
...
}
void enother_function_declaration(char var1, char var2){
time_exe(__func__, cl(clock()));
...
}
Я думаю, это выглядит так, как вы хотели
UPD
Позвольте мне объяснить ..
Более кроссплатформенный совместимый синтаксис:
sed -e ':a' -e 'N' -e'$!ba' -e 's/)\n{/)\n{ ... ;/g'
, где
':a'
- создает метку ветви (с именем a
) которые могут быть возвращены позже 'N'
- добавляет следующую строку к текущей (с \n
между ними) '$!ba'
- переходит на метку a
, если следующая строка - последняя строка 's/)\n{/)\n{ ... ;/g'
- выполняет глобальное замещение в одной строке, состоящей из всех строк и \n
с Для ответа на мой собственный вопрос я наконец нашел решение CodeProject, которое делает точно, что я ищу:
http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx
Как @Reuben уже указанный, можно использовать NtQueryProcessInformation для получения этой информации. Unfortuantely это не рекомендуемый подход, но, учитывая единственное другое решение, кажется, для несения издержек запроса WMI, я думаю, что мы проявим этот подход на данный момент.
Обратите внимание, что это, кажется, не работает при использовании кода, скомпилированного из Windows на 32 бита в Windows OS на 64 бита, но так как наши модули компилируются из источника на цели, которая должна быть хорошо для наших целей. Я использовал бы этот существующий код и если он прерывает Windows 7 или более позднюю дату, мы можем снова посмотреть на использование WMI. Спасибо за ответы!
ОБНОВЛЕНИЕ: более краткое и C только (в противоположность C++) версия той же техники проиллюстрированы здесь:
http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/
Кэшируемое решение: http://74.125.45.132/search?q=cache:-wPkE2PbsGwJ:windowsxp.mvps.org/listproc.htm+running+process+command+line&hl=es&ct=clnk&cd=1&gl=ar&client=firefox-a
in CMD
WMIC /OUTPUT:C:\ProcessList.txt PROCESS get Caption,Commandline,Processid
or
WMIC /OUTPUT:C:\ProcessList.txt path win32_process get Caption,Processid,Commandline
Также: http://mail.python.org/pipermail/python-win32/2007-December/006498.html
http://tgolden.sc.sabren.com/python/wmi_cookbook.html#running_processes
seems to do the trick:
import wmi
c = wmi.WMI ()
for process in c.Win32_Process ():
print process.CommandLine
Подход WMI, упомянутый в другом ответе, является, вероятно, самым надежным способом сделать это. Просматривая MSDN, я определил то, что похоже на другой возможный подход; это документируется, но не ясный, поддерживается ли это полностью. На языке MSDN, этом-
может быть изменен или недоступный в будущих версиях Windows...
В любом случае, при условии, что Ваш процесс имеет правильные полномочия, необходимо смочь звонить NtQueryProcessInformation
с a ProcessInformationClass
из ProcessBasicInformation
. В возвращенном PROCESS_BASIC_INFORMATION
структура, необходимо возвратить указатель на блок выполнения процесса целевого процесса (как поле PebBaseAddress
). ProcessParameters
поле PEB даст Вам подсказку к RTL_USER_PROCESS_PARAMETERS
структура. CommandLine
поле той структуры будет a UNICODE_STRING
структура. (Будьте осторожны не, также делают слишком много предположений о строке; нет никаких гарантий, что это будет ЗАВЕРШЕНО ПУСТЫМ УКАЗАТЕЛЕМ, и не ясно, необходимо ли будет снять изоляцию с названия выполняемого приложения с начала командной строки.)
Я не попробовал этот подход - и как я упомянул выше, это кажется немного... сомнительным (чтение: непортативный) - но это могло бы стоить попытки. Всего наилучшего...
Если Вы не родитель этих процессов, то это не зарегистрированные функции возможного использования :( Теперь, если Вы - родитель, можно сделать прием CreateRemoteThread, но иначе Вы почти наверняка получите Доступ запрещен, если Ваше приложение не будет иметь права администратора.