Что после exec () в команде ls. Является ли родительский процесс распечаткой вывода на консоль или дочерний?

У меня есть простые сомнения в выполнении команды ls . Как я понимаю из исследований, которые я сделал в Интернете, я понял ниже.

  1. Когда мы вводим команду командной строки ls, интерпретация этой команды.

  2. Как создать копию файла в нескольких каталогах?
  3. передавая stdin для обработки A и обработки B (вызывается A)
  4. Каково фактическое имя процесса, когда nautilus копирует файлы?
  5. Список доступных услуг DBus
  6. Имя процесса после убийства
  7. Можно ли найти, у какого vim / tmux открыт мой файл?
  8. Затем процесс оболочки обрабатывает и создает дочерний процесс, а родительский (shell) выполняет системный вызов wait() , эффективно ставя себя в спящий режим, пока ребенок не выйдет.

  9. Детский процесс наследует все дескрипторы открытых файлов и среду.

  10. Затем дочерний процесс выполняет exec() программы ls. Это считывает программу ls из файла программы на диск в существующий [дочерний] процесс.

  11. Когда программа ls запускается до завершения, она вызывает exit() и она посылает сигнал своему родителю, указывая, что дочерний объект завершен.

Мое сомнение начинается с этого момента, как только ls заканчивает свои задачи, отправляет ли он результат в родительский процесс или сам выводит на экран результат ?. Если он отправляет o / p обратно родительскому элементу, то использует ли он pipe() неявно?

  • Неустранимые процессы apache2
  • дочерний процесс не наследует ожидающие сигналы от родителя после системного вызова fork, почему?
  • Как я могу позволить пользователю приоритизировать процесс с отрицательной привлекательностью?
  • Программный срыв у пользователя, но выполняется под root
  • Почему apache2 обнаруживает несуществующий список процессов?
  • Процесс ест все время процессора
  • 3 Solutions collect form web for “Что после exec () в команде ls. Является ли родительский процесс распечаткой вывода на консоль или дочерний?”

    Как правило, родительский процесс ожидает завершения дочернего процесса, вызвав waitpid . Родительский процесс получает PID процесса из fork .

    Это означает, что ребенок никогда не сигнализирует родительскому процессу каким-либо образом, что он вышел или что произошло. Это делается системой, а не дочерним процессом.

    Если вы говорите о выходе программы, родитель обычно никогда не получает результат дочернего процесса, если только он не предоставил fds. Это также означает, что дочерний процесс печатает выходные данные, а не родительский процесс. Родительский процесс просто получает информацию о состоянии процесса (дополнительную информацию см. В макросах в man- waitpid )

    ls выводит то, что он должен выводить на свой стандартный вывод . Для этого он вызывает системный вызов записи, например:

      write(1, "file1 file2...\n", 16) 

    (или, скорее всего, он вызывает функции libc такие как printf или fwrite которые в конечном итоге выполняют системный вызов write() )

    Предполагается, что дескриптор файла 1 (стандартный вывод) уже был открыт и указывает на что-то. На самом деле, ls проверяет, указывает ли его дескриптор файла 1 на терминал или что-то еще. Если он не указывает на терминал, он вместо этого:

      write(1, "file1\nfile2...\n", 15) 

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

    Когда вы пишете:

      ls file1 file2 

    ls файла ls 1 укажет на тот же ресурс, что и fd 1 оболочки (например, если это была интерактивная оболочка, запущенная xterm , которая будет указывать на псевдотерминальное устройство, управляемое xterm). Оболочка ничего не делает, она унаследована от fork и потому, что флаг O_CLOEXEC обычно не задан дескриптором файла, он сохраняется при execve .

    Если вы пишете:

     var=$(ls file1 file2) 

    Оболочка создает канал и назначает fd 1 дочернего процесса на конец записи этого канала и читает другой конец канала для заполнения переменной var .

    Это не волшебство сделано после выхода, это просто сделано как часть работы процесса. Он не зависит от какой-либо другой активности оболочки. ls – это еще один процесс с его fd 1, связанным с каким-то ресурсом, таким как терминал, в то время как оболочка – это еще один процесс, занятый выполнением waitpid() .

    Однако вы можете обнаружить, что, когда stdout не является терминалом, ls буферизует его вывод и будет вызывать только write() когда будет накоплено достаточное количество данных (достаточно нескольких килобайт), или оно закрывает его выход или выходит из него. Итак, в этом отношении вы обнаружите, что write выполняется при выходе, но только в качестве части flushing буферов, выполняемых этими библиотеками ввода-вывода.

    Если exec(3) преуспевает, программа, которая вызвала его, больше не существует. Он заменяется программой exec ed. Новая программа наследует среду, в частности открытые файлы, оригинала.

    Linux и Unix - лучшая ОС в мире.