Программист использует файлы устройств в качестве интерфейса к драйверам устройств в их программах?

Если в настоящее время выполняется команда4, то это можно сделать довольно просто:

^Z
$ fg && right_command5 && command6

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

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


Однако: обратите внимание, что ваша исходная последовательность команд не делает того, что вы думаете . Когда вы это сделаете:

$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4

тогда команда2 будет возобновлена, , но остальная часть цепочки не будет . Остановка команды 2 с помощью Ctrl-Z означает, что она выходит аномально с помощью SIGTSTP (-20). Поскольку команда 2 выходит неслучайно, && короткое замыкание вне цепи и команда3 никогда не будет выполнена. Команда 4 будет запущена сразу же после окончания возобновленной команды 2 .

Вы можете наблюдать за этим поведением в действии, заменив && на ||:

$ command2 || echo Running command3, exit was $?
^Z
[1]+  Stopped                 command2
Running command3, exit was 148
$

Вам необходимо перечислить всю последующую цепочку команд при возобновлении, если вы хотите, чтобы поведение, к которому вы стремитесь, было таким, каким вы стремитесь. В качестве альтернативы, если вы хотите иметь возможность остановить и возобновить цепочки команд, вы должны запустить их в подоболочке:

$ (command1 && command2 && command3)
^Z
$ fg

В этом случае, однако, нет никакого способа вмешаться и заменить команду вообще.

1
10.01.2015, 21:56
1 ответ

Файлы устройства AFAIK являются единственным вариантом для процессов пользователя, чтобы получить доступ к устройствам. Ядро не волнует, является ли этот процесс оболочкой.

C Программы имеют вариант для тонкой настройки доступа устройства: IOCTL Call Call:

MAN 2 IOCTL :

int ioctl(int d, unsigned long request, ...);

Может быть, есть для этого, но я не осознавать любой.

> strace fdisk -l /dev/sda
[...]
open("/dev/sda", O_RDONLY|O_CLOEXEC)    = 3
[...]
ioctl(3, BLKGETSIZE64, 500107862016)    = 0
[...]
ioctl(3, CDROM_GET_CAPABILITY or SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT, 0) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(3, BLKALIGNOFF, 0)                = 0
ioctl(3, BLKIOMIN, 4096)                = 0
ioctl(3, BLKIOOPT, 0)                   = 0
ioctl(3, BLKPBSZGET, 4096)              = 0
ioctl(3, BLKSSZGET, 512)                = 0
ioctl(3, BLKSSZGET, 512)                = 0
uname({sys="Linux", node="inno", ...})  = 0
ioctl(3, BLKGETSIZE64, 500107862016)    = 0
ioctl(3, HDIO_GETGEO, {heads=255, sectors=63, cylinders=60801, start=0}) = 0
1
27.01.2020, 23:51

Теги

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