Я довольно плохо знаком с системными вызовами 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);
Я что-то упустил?Мои решения неверны?Если так, то я был бы рад услышать объяснение, почему, спасибо.