Лучшая строка для hg

udev автоматически обнаружит устройства и загрузит соответствующий модуль.

Вы можете запретить Debian автоматически загружать модуль wl , добавив свой собственный элемент черного списка в каталог modprobe.d .

От имени пользователя root создайте файл в /etc/modprobe.d , который заканчивается расширением файла .conf и внутри поместите:

blacklist wl

Затем вы сможете загрузить модуль вручную с помощью команды insmod wl .

-1
04.02.2019, 14:58
4 ответа

«Теперь мне интересно, есть ли способ проверить, переходит ли программа в бесконечный цикл до того, как будет прочитан весь ввод. Например, если программа переходит в бесконечный цикл , это единственный способ остановить программу ».

Мы знаем ответ на этот вопрос почти восемьдесят лет . Ответ - нет, выхода нет.

Спасибо, что задали вопрос, который даже не был близок к вашему фактическому вопросу:

«Я пытаюсь оценить работу ученика. Я просто хочу создать сценарий, чтобы использовать его в будущем. Прямо сейчас я пусть он работает хорошо, используя таймер сна, но я хочу сделать сценарий более надежным без таймера »

Простое решение:

# how many seconds of CPU (not wall clock)
# should the student's program get?
# 10 seconds is generous for an intro class
# 60 seconds of CPU would be obscene
$ ulimit -t 10
$ run_student_program

# but since I don't have a student program

$ time dd if=/dev/zero of=/dev/null
Killed

real    0m9.998s
user    0m3.080s
sys     0m6.912s
1
29.04.2021, 00:49

Я использую:

hg addremove

для этого после того, как удалил какой-либо корень из извлеченного каталога (или после того, как добавил узоров в файл .hgignore ).
hg addremove -h говорит вам:

Add all new files and remove all missing files from the repository.

Mercurial жалуется на * в имени файла. Зарезервированный символ, который нельзя использовать в именах файлов Windows. Однако само сообщение поступает на stderr и не должно влиять на работу труб.

Альтернативой является использование

hg remove --after

, которое помечает файлы, которые удалены, но комментирует все файлы (те, которые еще есть, а также те, которые удалены) и, похоже, не реагирует на опцию -quiet .

-121--290950-

Когда xargs видит \!\(\* -4.pdf , он понимает ! (* -4.pdf . При использовании xargs необходимо создать входные данные, соответствующие его синтаксису ввода, который не похож ни на что другое. Простое добавление обратной косой черты перед местами позволяет справиться только с местами.

В Linux, * BSD и OSX, xargs поддерживает параметр -0 , который говорит ему действовать с записями, разделенными нулевыми байтами без кавычек. hg status -0 создает записи, разделенные нулевыми байтами. Остается обработать промежуточную обработку, чтобы справиться с нулями вместо новых линий в качестве сепараторов.

С GNU awk или любым другим awk, который поддерживает нулевые байты в качестве разделителей записей (я думаю, что BSD/OSX awk), вы можете переключить преобразование в awk.

hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove
-121--290951-

Я думаю, что у меня есть гораздо более простое решение, но я не уверен, насколько оно портативно. Рассмотрим:

$ cat trunc.c
#include <stdio.h>

int main() {
    int c;
    while(((c = getchar()) != EOF) && ((c & 0xff) != 0xff))
        putchar(c);
    return 0; 
}

Это использует тот факт, что на машине с двумя дополнениями (-1 & 0xff) = = 0xff . Это захватывает вашу программу, которая печатает EOF как символ. Я проверил его:

your_buggy_source_gen < any_ascii_file | trunc

, что эквивалентно cat any_ascii_file, при условии, что в нем нет октетов значения 0xff.

1
29.04.2021, 00:49

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

Одним из способов сделать это может быть модуль LD_PRELOAD, который перехватывает системный вызов "read()" таким образом, что вызывает фактический системный вызов "read()", а затем завершает работу, когда встречает условие конца файла. (В идеале я бы перехватил "getchar()", но это обычно макрос, а не вызов функции, поэтому его нельзя перехватить.)

Другим способом было бы запустить код под отладчиком, найти место, где он переходит в бесконечный цикл, а затем внести исправления в двоичный файл, либо изменив исполняемый файл, либо, опять же, применив модуль LD_PRELOAD, который заменяет ошибочную функцию.

Или вы можете поступить так, как предложено в предыдущем ответе, и направить вывод в нечто, что закрывает вход, когда ошибочная программа выводит что-то, указывающее на то, что она достигла конца своего ввода. (Обратите внимание, что это зависит от того, что программа не отлавливает SIGPIPE, что является справедливым предположением в данном случае.)

Более сложной версией этого может быть совместное использование входного файлового дескриптора с другой программой, которая не читает из него, но следит за тем, достиг ли он конца. Однако это особенно сложно сделать, особенно если вы имеете дело с трубами, сокетами или устройствами.

Предполагая, что ваша ошибочная программа читает из stdin, оберните ее чем-то вроде этого:

  #!/bin/sh
  run-bad-program "$@" &
  pid=$!
  perl -MFcntl=:mode -e '
    @S = stat STDIN or die "Invalid input; $!\n";
    S_IFREG($S[2]) or die "Input is not a plain file\n";
    while (sysseek(STDIN,0,1) != $S[7]) { sleep 1 }
  '
  kill $pid
  wait
0
29.04.2021, 00:49

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

(cat file ; sleep 2) | stupid_program
0
29.04.2021, 00:49

Теги

Похожие вопросы