LINUX.ORG.RU

/sbin/telinit и /bin/systemctl — один и тот же файл, но справку дают разную

 


0

1

Как такое может быть?

#смотрим, что /sbin/telinit -- это симлинк на /bin/systemctl
vodka@vodka-PC:/tmp$ ls -l /sbin/telinit
lrwxrwxrwx 1 root root 14 окт 11 18:51 /sbin/telinit -> /bin/systemctl
#сверяем хеш-суммы
vodka@vodka-PC:/tmp$ md5sum /sbin/telinit
846dc422ba2e2db10766f082627bcbf5  /sbin/telinit
vodka@vodka-PC:/tmp$ md5sum /bin/systemctl
846dc422ba2e2db10766f082627bcbf5  /bin/systemctl

И далее вызываем

/sbin/telinit --help
/bin/systemctl --help

И результаты совершенно разные… С помощью каких механизмов утилита /bin/systemctl отслеживает, что к ней обратились через симлинк /sbin/telinit и выдаёт уже другую справку?

★★★

Последнее исправление: iljuase (всего исправлений: 1)

Как-то так:

cat <<EOF>>main.c
#include <stdio.h>
#include <string.h>
#include <libgen.h>

int
main(int argc, char **argv) {
	if (strcmp(basename(argv[0]), "iljuase") == 0) {
		printf("hello iljuase\n");
	} else {
		printf("hello everybody else\n");
	}
	return 0;
}
EOF
make main
./main
# hello everybody else
ln main iljuase
./iljuase
# hello iljuase
beastie ★★★★★
()
Ответ на: комментарий от Jameson

Busybox активно магию argv использует кстати. Там почти все утилиты это симлинки на один единственный исполняемый файл.

Это называется multi-call binary, из примеров еще можно привести dropbear.

annulen ★★★★★
()