какой процесс выполняется execvp (2), когда исполняемый файл указан как "/ bin / bash"? - PullRequest
0 голосов
/ 07 июля 2019

Я знаю, что execvp (2) может выполнить сценарий в процессе. Я сталкиваюсь с кодом execvp (2), который не имеет указанного исполняемого файла? Он может быть скомпилирован и успешно запущен, но ничего не сделал. Я не уверен, что он делает. Я предполагаю, что он просто открыл другой процесс, но ничего не сделал. Но вопрос в том, является ли / bin / bash исполняемым файлом? Я думаю, что все исполняемые файлы начинаются с префикса "./", например "./hello".

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  /* exec a shell /bin/bash with no arguments other than its name */
  char *args[] = {"/bin/bash", NULL};
  if (execvp(args[0], args))
    {
    fprintf(stderr, "Failed to exec a shell. \n");
    exit(1);
    }

  return 0;
}

1 Ответ

0 голосов
/ 07 июля 2019

какой процесс выполняется execvp (2), если для исполняемого файла указано /bin/bash?

/bin/bash выполнено.

Я знаю, что execvp (2) может выполнить сценарий в процессе. Я сталкиваюсь с кодом execvp (2), который не имеет указанного исполняемого файла?

Это неверно. Код указывает /bin/bash в качестве исполняемого файла.

Он может быть скомпилирован и успешно запущен, но ничего не сделал. Я не уверен, что это делает.

Он не сделал "ничего".

Фактически, он заменяет текущий процесс новой оболочкой. Теперь вы будете вводить команды для процесса, отличного от того, который вы использовали ранее. Вы можете подтвердить это различными способами; например посмотрев на вывод ps -efl или запустив echo $SHLVL до и после запуска вашей C-программы.

Когда вы наберете exit, вы вернетесь к предыдущей (родительской) оболочке.

Я предполагаю, что он просто открыл другой процесс, но ничего не сделал.

Это выглядит только так. Смотри выше.


(Ваш фактический вопрос - красная сельдь, основанная на неправильном понимании / неправильном толковании того, что делает программа на Си).

Но вопрос в том, является ли / bin / bash исполняемым файлом?

Это зависит от вашей системы. Но в типичной системе Linux это будет.

Я думаю, что все исполняемые файлы начинаются с префикса "./", например "./hello".

Это неправильно. ОС решает, является ли файл исполняемым, на основании 1) режима доступа к файлу (т.е. установлено ли разрешение на выполнение) и 2) типа файла, определенного его заголовком.

Вы можете подтвердить, что bin/bash является исполняемым, запустив ls -l /bin/bash и file /bin/bash.

...