Никогда не делайте преждевременное предположение как, другой код приложения и использование могут повлиять на Вашу функцию. Так рассмотрение функции является изоляцией, бесполезно.
, Если Вы серьезны с приложением затем VTune это или используете какой-либо подобный профильный инструмент и смотрите на горячие точки.
Ketan
См. Перенаправление вывода из запущенного процесса .
Сначала я запускаю команду
cat> foo1
в одном сеансе и проверяю эти данные из stdin копируется в файл. Затем в другом сеансе я перенаправляю вывод.Сначала нахожу PID процесса:
$ ps aux | grep cat rjc 6760 0,0 0,0 1580 376 очков / 5 S + 15:31 0:00 кот
Теперь проверьте дескрипторы файлов, которые он открыл:
$ ls -l / proc / 6760 / fd всего 3 lrwx—— 1 rjc rjc 64 27 февраля, 15:32 0 -> / dev / pts / 5 l-wx—— 1 rjc rjc 64 27 февраля, 15:32 1 -> / tmp / foo1 lrwx—— 1 rjc rjc 64 27 февраля, 15:32 2 -> / dev / pts / 5
Теперь запустите GDB:
$ gdb -p 6760 / bin / cat GNU gdb 6.4.90-debian [лицензия удалена] Присоединение к программе: / bin / cat, процесс 6760 [вырезать другие вещи, которые сейчас не интересны] (gdb) p закрыть (1) $ 1 = 0 (gdb) p creat ("/ tmp / foo3", 0600) 2 доллара = 1 (gdb) q Программа запущена. Все равно выйти (и отсоединить)? (y или n) y Отключение от программы: / bin / cat, процесс 6760
Команда
p
в GDB распечатает значение выражения, выражение может быть функцией для вызова, это может быть системный вызов ... Поэтому я выполняюclose ()
и передаю дескриптор файла 1, затем я выполняю системный вызовcreat ()
, чтобы открыть новый файл. Результатомcreat ()
было 1, что означает, что он заменил предыдущий дескриптор файла. Если бы я хотел использовать один и тот же файл для stdout и stderr или если бы я хотел заменить дескриптор файла каким-либо другим номером, мне нужно было бы вызвать системный вызовdup2 ()
для достижения этого результата.В этом примере я решил использовать
creat ()
вместоopen ()
, потому что здесь меньше параметров. Макросы C для флагов нельзя использовать из GDB (он не использует заголовки C), поэтому мне пришлось бы читать файлы заголовков, чтобы обнаружить это - это не так сложно сделать, но потребует больше времени. Обратите внимание, что 0600 - это восьмеричное разрешение для владельца, имеющего доступ для чтения / записи, а также для группы и других пользователей, не имеющих доступа. Также можно было бы использовать 0 для этого параметра и позже запустить chmod для файла.После этого я проверяю результат:
ls -l / proc / 6760 / fd / всего 3 lrwx—— 1 rjc rjc 64 27.02.2008 15:32 0 -> / dev / pts / 5 l-wx—— 1 rjc rjc 64 27.02.2008 15:32 1 -> / tmp / foo3 <==== lrwx—— 1 rjc rjc 64 27.02.2008 15:32 2 -> / dev / pts / 5
При вводе дополнительных данных в
cat
файл/ tmp / foo3
добавляется к.Если вы хотите закрыть исходный сеанс, вам нужно закрыть все файлы обрабатывает его, откройте новое устройство, которое может быть управляющим tty, а затем вызовите
setsid ()
.
Dupx
Dupx — это простая утилита *nix для перенаправления стандартного вывода/ввода/ошибки уже запущенного процесса.
Мотивация
Я часто оказывался в ситуации, когда процесс, который я запускал в удаленной системе через SSH, занимал гораздо больше времени, чем я ожидал. Мне нужно разорвать SSH-соединение, но если я это сделаю, процесс умрет, если попытается что-то написать в stdout/ошибка сломанного канала. Я хотел бы приостановить процесс с помощью ^Z, а затем выполнить a
bg %1 >/tmp/stdout 2>/tmp/stderr
К сожалению, это не сработает (в шеллах я знаю).