Дополнение:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcmp
#include <utmpx.h>#define XTTY ":0"
int main(void)
{
struct utmpx *entry;
setutxent();
while ((entry = getutxent()) != NULL) {
if (!strcmp(entry->ut_line, XTTY) && (entry->ut_type == USER_PROCESS))
printf("%s %s\n", entry->ut_line, entry->ut_user);
}
endutxent();
return(EXIT_SUCCESS);
}
Бережем наносекунды! - strcmpless version
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcmp
#include <utmpx.h>int main(void)
{
const char *XTTY = ":0";
struct utmpx *entry;
short i = 0;
setutxent();
while ((entry = getutxent()) != NULL) {
if (entry->ut_type == USER_PROCESS) {
while (*XTTY && *entry->ut_line) {
if (*XTTY++ != entry->ut_line[i++])
break;
}
if (*XTTY || entry->ut_line[i]) continue;
printf("%s %s\n", entry->ut_line, entry->ut_user);
}
}
endutxent();
return(EXIT_SUCCESS);
}
/* Кто переделает без переменной i, тому с полки пирожок :) */
Тайный смысл в этих извращениях был такой:
При запуске системы грузится демон, который чёй-то там делает...
По сигналу свыше, этот демон должен снять дамп экрана Х-ов, если они есть и,
отослать вызывающему.
Как вы понимаете, демон грузится от рута, переменные окружения свои, так что,
ни какой речи о getenv, не может и быть. Вызывать who и парсить результаты вывода -
это через ж..пу и для web-программеров, они всё подряд парсят.
Собственно, если запустите strace -e open who, то увидите, что он именно так, через utmp и работает.