Как конвейер влияет на стандартный ввод?

TL;DR :Ответ и да, и нет; вы используете драйверы Intel и Nvidia соответственно для IGP и дискретного графического процессора.

Поскольку Bumblebee — это проект, направленный на обеспечение поддержки технологии Optimus, позволяющей использовать дискретный графический процессор Nvidia для высокопроизводительных задач, а IGP — для всех остальных, вам потребуется использовать несколько команд для переключения между ними. А значит, между драйвером Intel i915и драйвером Nvidia nvidia-driver.

Короче говоря, вы используете IGP для всего, что вы делаете, за исключением случаев, когда вы используете команду optirunдля запуска программы с использованием дискретного графического процессора.

Поскольку вывод команды optirun glxgears -infoдает вам GL_VERSION = 4.6.0 NVIDIA 390.87, это означает, что вы используете (благодаряoptirun)драйверу NVIDIA 390.87.

Таким образом, оба драйвера установлены правильно, и вы используете драйвер Nvidia только перед программой, которую хотите запустить, с помощью optirun.

Редактировать:

Похоже, что начиная с версии Bumblebee 3.0 переключение между IGP и дискретным графическим процессором является функцией, встроенной в Bumblebee и включенной по умолчанию. Вы должны попробовать некоторые тяжелые -программы, чтобы увидеть, произойдет ли это, у меня нет ноутбука Optimus, чтобы попробовать это самому.

2
07.07.2020, 02:14
2 ответа

Стандартное определение основной функции программы на C:

int main(int argc, char *argv[])

Здесь argcи argv— аргументы командной строки, -vи matchдля grepв данном случае. Обратите внимание, что они не одна строка, но оболочка уже разделила аргументы на отдельные строки (NUL/\0с завершением, как обычно в C ). argcсодержит количество аргументов, а argvсами аргументы.

С другой стороны, стандартный ввод — это просто FILE *, вы можете использовать его напрямую с любой из функций stdio. fgets(buf, sizeof(buf), stdin)и т. д.


Я не знаю, откуда ты взял cat /dev/pts/0. Он будет читать с этого конкретного псевдо-терминала -, возможно, конфликтуя с чтением вашей оболочкой на том же терминале. (Попробуйте открыть два терминала, xterm, сеансы SSH, экран и т. д. Затем запустите ttyна первом, он покажет имя терминала, например. /dev/pts/123. Запуститеcat /dev/pts/123(с данным именем )во втором терминале, затем попробуйте ввести что-нибудь в первом.)

6
18.03.2021, 23:21

Канал представляет собой буфер, выделенный в ядре с файловыми дескрипторами, связанными с концами чтения и записи. Когда вы бежитеcat file.txt | grep -v match:

  • Оболочка создает канал (с помощью системного вызова pipe())
  • Оболочка fork()с. Дочерний процесс использует системный вызов dup2(), чтобы закрыть свой стандартный поток вывода и дублировать конец записи канала в стандартный вывод. (После этого запись в стандартный вывод будет осуществляться в буфер ядра. )Затем дочерний exec()с catс обновленным стандартным выводом.
  • Оболочка fork()снова s.Дочерний процесс использует системный вызов dup2(), чтобы закрыть свой стандартный поток ввода и дублировать конец канала чтения для стандартного ввода. (После этого чтение из стандартного ввода будет происходить из буфера ядра. )Затем дочерний exec()s grepс обновленным стандартным вводом.

В этот момент работают как cat, так и grep. Если grepпопытается прочитать из стандартного ввода (канал ), а канал пуст, чтение будет заблокировано. Если catснова попытается записать в стандартный вывод (, канал )и канал будут заполнены, запись будет заблокирована. В противном случае, когда catзаписывает в буфер, grepможет читать из буфера.

11
18.03.2021, 23:21

Теги

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