Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
listing = %x(ls -l)now = %x(date)Применение
%xПоскольку обратные кавычки — это на самом деле метод (в некотором смысле), то его можно переопределить. Изменим его так, чтобы он возвращал не одну строку, а массив строк. Конечно, при этом мы создадим синоним старого метода, чтобы его можно было вызвать.
alias old_execute `def `(cmd) out = old_execute(cmd) # Вызвать исходный метод обратной кавычки. out.split("n") # Вернуть массив строк!endentries = `ls -l /tmp`num = entries.size # 95first3lines = %x(ls -l | head -n 3)how_many = first3lines.size # 3Как видите, при таком определении изменяется также поведение ограничителя
%xВ следующем примере мы добавили в конец команды конструкцию интерпретатора команд, которая перенаправляет стандартный вывод для ошибок в стандартный вывод:
alias old_execute `def `(cmd) old_execute(cmd + " 2>&1")endentries = `ls -l /tmp/foobar`# "/tmp/foobar: No such file or directoryn"Есть, конечно, и много других способов изменить стандартное поведение обратных кавычек.
14.1.3. Манипулирование процессами
В этом разделе мы обсудим манипулирование процессами, хотя создание нового процесса необязательно связано с запуском внешней программы. Основной способ создания нового процесса — это метод
forkforkМетод
forkKernelProcessThreadСуществуют два способа вызвать метод
forknilpid = forkif (pid == nil) puts "Ага, я, должно быть, потомок." puts "Так и буду себя вести."else puts "Я родитель." puts "Пора отказаться от детских штучек."endВ этом не слишком реалистичном примере выводимые строки могут чередоваться, а может случиться и так, что строки, выведенные родителем, появятся раньше. Но сейчас это несущественно.
Следует также отметить, что процесс-потомок может пережить своего родителя. Для потоков в Ruby это не так, но системные процессы — совсем другое дело.
Во втором варианте вызова метод
forkfork do puts "Ага, я, должно быть, потомок." puts "Так и буду себя вести."endputs "Я родитель."puts "Пора отказаться от детских штучек."Конечно, pid по-прежнему возвращается, мы просто не показали его.
Чтобы дождаться завершения процесса, мы можем вызвать метод
waitProcesswait2Pid1 = fork { sleep 5; exit 3 }Pid2 = fork { sleep 2; exit 3 }Process.wait # Возвращает pid2Process.wait2 # Возвращает [pid1,768]Чтобы дождаться завершения конкретного потомка, применяются методы
waitpidwaitpid2pid3 = fork { sleep 5; exit 3 }pid4 = fork { sleep 2; exit 3 }Process.waitpid(pid4,Process::WNOHANG) # Возвращает pid4Process.waitpid2(pid3, Process::WNOHANG) # Возвращает [pid3,768]Если второй параметр не задан, то вызов может блокировать программу (если такого потомка не существует). Второй параметр можно с помощью ИЛИ объединить с флагом
Process::WUNTRACEDМетод
exit!pid1 = fork { exit! } # Вернуть код завершения -1.pid2 = fork { exit! 0 } # Вернуть код завершения 0.Методы
pidppidproc1 = Process.pidfork do if Process.ppid == proc1 puts "proc1 - мой родитель" # Печатается это сообщение. else
