Rambler's
Top100

Чтение аргументов командной строки в Linux с помощью единой ФС

Автор: lonesome TSH/Digital Daemons
Дата: .03.2003
Раздел: Низкоуровневое программирование в Linux

Что такое единая ФС Linux? Это словосочетание означает, что все, абсолютно все в Linux представлено в виде файлов. Помимо тех файлов к которым мы все привыкли (т.е. именованных областей на диске) в Linux существует множество других файлов, которые доступны обычными средствами, т.е. для программ они неотличимы от обычных файлов. Например многие файлы в директории /dev являются файлами-устройствами. С их помощью программа, используя обычные средства работы с файлами, может взаимодействовать с внешними устройствами.

Самый известный специальный файл - знаменитая "черная дыра" /dev/null. Отправка чего-нибудь в /dev/null действительно приводит к моментальному исчезновению этих данных из системы.

В директории /proc находятся каталоги всех выполняющихся в системе процессов и название каждого каталога соотвествует PID'у - идентификатору процесса, например /proc/1249/. Что важно - в этой директории существует файл-ссылка self, который всегда ссылается на директорию соотвествующую текущему процессу, в которой находятся некоторые интересные файлы, точнее псевдофайлы. Например в файле cmdline находится командная строка которой запустили процесс. Улавливаете идею?

Следующая программа выведет на экран командную строку, которой она была запущена

global _start	
	
	section .text
		
_start:

	; Извлечение командной строки хитроумным способом из
	; /proc/self/cmdline ;)

	mov eax, 5		; Системный вызов "open"
	mov ebx, filename_cmdline
	xor ecx, ecx		; O_RDONLY == 0
	xor edx, edx
	int 0x80



	mov ebx, eax		; Предыдущая функция возвратила
				; дескриптор файла
	mov eax, 3		; Системный вызов "read"
	mov ecx, buffer_cmdline
	mov edx, 0x100
	int 0x80
	
			
	mov eax, 4		;Системный вызов "write"
	xor ebx, ebx		
	inc ebx			;Идентификатор stdout - 1
	int 0x80
	
	mov eax, 1		;Системный вызов "exit"
	xor ebx, ebx
	int 0x80

	section .data

filename_cmdline:	db "/proc/self/cmdline",0
buffer_cmdline:	resb 0x100

Компиляция: nasm -felf cmdline.asm -o cmdline.o
Компоновка: ld cmdline.o -o cmdline


Rambler's Top100