проблемы с пониманием системных вызовов - PullRequest
0 голосов
/ 01 апреля 2019

Я довольно плохо знаком с системными вызовами Linux, и мне трудно понять, как эти вызовы ведут себя, поэтому я пытаюсь понять, как эти вызовы работают, анализируя вывод некоторых примеров кодов.Я предоставлю свое решение для вывода этих кодов.

В первом коде переменная pid получает возвращаемое значение fork.Мы проверяем, было ли создание потомка успешным, проверяя значение pid.Если pid отрицателен, мы завершаем родительский процесс и ничего не печатаем.Если pid положительный, то мы находимся в родительском процессе, и мы печатаем родительский pid и завершаем родительский процесс.Если pid равен нулю, то мы находимся в дочернем процессе, и либо выполняется execv (мы засыпаем на 1 секунду и ничего не печатаем), либо мы печатаем дочерний pid.так как родительский и дочерний процессы выполняются одновременно, у нас будет 2 сценария.Первый - это родительский процесс, запускаемый первым, затем дочерний процесс, запускаемый после, а второй сценарий - дочерний процесс, запускаемый первым, а потом родительский процесс, запускаемый после.

Во втором коде выполняются как родительский, так и дочерний процессы.в то же время, поэтому у нас также будет 2 сценария.В первом сценарии мы начинаем с дочернего процесса, печатая 0, затем добавляем 4 к значению и, наконец, завершаем со статусом 4, в родительском процессе мы пропускаем ожидание, поскольку мы уже предварительно сформировали дочерний процесс, затем WEXITSTATUS назначает 4 значению, а затем значение становится 7Мы продолжаем и печатаем 7 после этого, увеличиваем значение на 4 и завершаем родительский процесс со значением в качестве параметра для выхода.В ВТОРОМ сценарии мы начинаем с родительского процесса, ожидая завершения выполнения дочернего процесса, поэтому мы выполняем дочерний процесс с родительским процессом, результатом которого является тот же результат, что и в первом сценарии.

Первый код: -

pid_t pid = fork();

if (pid < 0)
{
  exit(1);
}

else if (pid > 0)
{
  printf("%d", getpid());
  exit(0);
}

else
{
  char *const argv[] = {"sleep", "1", NULL};
  execv("/bin/sleep", argv);
  printf("%d", getpid());
}

Второй код: -

int value = 0;

if (fork() != 0)
{
  wait(&value);
  value = WEXITSTATUS(value);
  value += 3;
}

printf("%d\n", value);
value += 4;
exit(value);

Я что-то упустил?Мои решения неверны?Если так, то я был бы рад услышать объяснение, почему, спасибо.

...