Оператор запятой комбинирует эти два выражения любая сторона его в один, оценивая их обоих в слева направо порядке. Значение правой стороны возвращается как значение целого выражения. (expr1, expr2)
похож { expr1; expr2; }
, но можно использовать результат expr2
в вызове функции или присвоении.
Это часто замечается в for
циклы, чтобы инициализировать или поддержать несколько переменных как это:
for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
/* do something with low and high and put new values
in newlow and newhigh */
}
Кроме этого, я только использовал его "в гневе" в еще одном случае при оборачивании двух операций, которые должны всегда сочетаться в макросе. У нас был код, который скопировал различные двоичные значения в буфер байта для отправки в сети, и указатель поддержал, где мы имели до:
unsigned char outbuff[BUFFSIZE];
unsigned char *ptr = outbuff;
*ptr++ = first_byte_value;
*ptr++ = second_byte_value;
send_buff(outbuff, (int)(ptr - outbuff));
, Где значения были short
с или int
с, мы сделали это:
*((short *)ptr)++ = short_value;
*((int *)ptr)++ = int_value;
Позже мы читаем, что это не было действительно допустимым C, потому что (short *)ptr
больше не l-значение и не может быть увеличено, хотя наш компилятор в то время не возражал. Для фиксации этого мы разделяем выражение в два:
*(short *)ptr = short_value;
ptr += sizeof(short);
Однако этот подход полагался на всех разработчиков, не забывающих вставить оба оператора все время. Мы хотели функцию, куда Вы могли передать в выходном указателе, значении и и тип значения. Этот являющийся C, не C++ с шаблонами, у нас не могло быть функционального взятия произвольный тип, таким образом, мы обосновались на макросе:
#define ASSIGN_INCR(p, val, type) ((*((type) *)(p) = (val)), (p) += sizeof(type))
При помощи оператора запятой мы смогли использовать это в выражениях или как операторы, как мы желали:
if (need_to_output_short)
ASSIGN_INCR(ptr, short_value, short);
latest_pos = ASSIGN_INCR(ptr, int_value, int);
send_buff(outbuff, (int)(ASSIGN_INCR(ptr, last_value, int) - outbuff));
я не предполагаю, что любым из этих примеров является хороший стиль! Действительно, я, кажется, помню Steve McConnell Код, Завершенный отговаривание от ровного использования операторов запятой в for
цикл: для удобочитаемости и пригодности для обслуживания, циклом должны управлять только одна переменная и выражения в for
, сама строка должна только содержать управляющий код цикла, не другие дополнительные биты обслуживания цикла или инициализации.
Вы получаете только те процессы, которые "принадлежат" вам - тот же идентификатор пользователя.
Можно ли подключиться к нему с помощью jvisualvm?
Мне повезло с отладкой процессов, запущенных пользователем SYSTEM, запустив это из командной строки:
c:> time/t
11:18 AM
c:> at 11:19 /interactive cmd.exe
Added a new job with job ID = 1
Используйте время на 1 минуту в будущем. При выполнении задания "at" откроется командная строка Windows, запущенная от имени пользователя SYSTEM. Оттуда вы должны увидеть процессы Java.
Если служба работает от имени локального пользователя (проверьте подробности в "mmc% windir% \ system32 \ SERVICES.MSC", дважды щелкнув службу и выбрав Вкладка "Вход в систему") вы можете сделать то же самое с помощью "runas":
runas /user:USERNAME cmd.exe
Я нашел только предложение запустить visuamvm (или другие инструменты) в качестве службы Windows: Мониторинг процессов Java, выполняемых как служба Windows
Возможно, кто-то еще знает лучшее решение .
Чтобы запустить утилиты, вы можете подключиться к сеансу консоли с помощью «mstsc / admin», используя учетную запись для входа (не знаю точных разрешений, необходимых для есть, я был в группе администраторов) и использую инструмент Sysinternals psexec для работы в качестве системы. Вот пример использования jstack.exe:
psexec -s "%JAVA_HOME%\bin\jstack.exe" PID >stack.txt
Где PID - это идентификатор вашего процесса. Вам также может потребоваться заменить фактический путь к JDK в зависимости от вашей конкретной среды.
Кроме того, каталог TEMP должен быть установлен правильно или еще раз инструменты работать не будут.