2016-04-13 3 views
2

Я изучаю UNIX и системные вызовы, и я сталкивался с низкими и сложными вопросами. Вопрос спрашивает, что системные вызовы называются для этой команды:Неявные системные вызовы в командах UNIX

grep word1 word2 > file.txt

Я сделал некоторые исследования, и я не смог найти огромное количество ресурсов на подстилающей UNIX вызовов. Тем не менее, мне кажется, что ответ будет open (открыть и дескриптор файла для файла file.txt), затем dup2 (изменить STDOUT из grep в файле дескриптора open), то write чтобы написать STDOUT из grep (который теперь является файловым дескриптором file.txt) и, наконец, close(), чтобы закрыть дескриптор файла file.txt ... Однако я понятия не имею, прав я или по правильному пути, может ли кто-нибудь с опытом работы в UNIX просветить меня Эта тема?

+1

Я надеюсь, что вы найдете ответ на свой вопрос здесь , но вы можете найти [этот стек] (http://unix.stackexchange.com/), который лучше подходит для ответа на него. Удачи! – Vandal

+0

Вы можете посмотреть [исходный код GNU grep] (http://git.savannah.gnu.org/cgit/grep.git). –

+3

Перенаправление STDOUT' выполняется оболочкой, 'grep' даже не знает, что происходит перенаправление, это полностью прозрачно. –

ответ

5

Вы находитесь на правильном пути в своих исследованиях. Эта команда очень полезна для отслеживания системных вызовов в любой программе:

strace

На моем компьютере она показывает выход (без потока перенаправления):

$ strace grep abc ss.txt 
execve("/bin/grep", ["grep", "abc", "ss.txt"], [/* 237 vars */]) = 0 
brk(0)         = 0x13de000 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1785694000 
close(3)        = 0 
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 
stat("ss.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0 
open("ss.txt", O_RDONLY)    = 3 
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffa0e4f370) = -1 ENOTTY (Inappropriate ioctl for device) 
read(3, "abc\n123\n321\n\n", 32768)  = 13 
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f178568c000 
write(1, "abc\n", 4abc 
)     = 4 
read(3, "", 32768)      = 0 
close(3)        = 0 
close(1)        = 0 
munmap(0x7f178568c000, 4096)   = 0 
close(2)        = 0 
exit_group(0)       = ? 
+1

Но это конкретный инструмент для Linux. Для Unix вообще вы обычно можете использовать 'dtrace'. (Который, я думаю, также будет перенесен в Linux в ближайшее время.) –

+3

@DavidOngaro: Утверждение 'dtrace' является нормальным для Unix, было бы преувеличением, я думаю. Вы можете использовать 'dtrace' в Solaris (хотя' truss' был проще для пользователя); на Mac существует вариант 'dtrace'; но другие системы (HP-UX, AIX, ...) используют другие команды (чем 'dtrace' или' strace' или 'truss'). –

Смежные вопросы