Как программа `login` в Linux вызывает оболочку входа? - PullRequest
0 голосов
/ 21 декабря 2018

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

С https://github.com/karelzak/util-linux/blob/200769b6c0dff6863089ea2a9ff4ea9ccbd15d0f/login-utils/login.c#L939

    child_pid = fork();
    if (child_pid < 0) {
        warn(_("fork failed"));

        pam_setcred(cxt->pamh, PAM_DELETE_CRED);
        pam_end(cxt->pamh, pam_close_session(cxt->pamh, 0));
        sleepexit(EXIT_FAILURE);
    }

После того, как login разветвляет ребенка, где он запускает оболочку входа в систему?

Обновление

Спасибо закомментарий.Теперь я нахожу, где login выполняет оболочку входа в систему.Увидеть ниже.Но мне кажется, что код login не fork() не является дочерним для выполнения оболочки входа в систему, но я узнал, что login и оболочка входа в систему работают в разных процессах, и login ожидает, пока оболочка входа невыход.

  • Действительно ли код означает, что login не fork() не выполняет оболочку входа в систему?

  • Если login fork() дочерний элемент для запуска оболочки входа в систему, откуда он wait() для выхода из оболочки входа в систему?

код :

/* if the shell field has a space: treat it like a shell script */
if (strchr(pwd->pw_shell, ' ')) {
    buff = xmalloc(strlen(pwd->pw_shell) + 6);

    strcpy(buff, "exec ");
    strcat(buff, pwd->pw_shell);
    childArgv[childArgc++] = "/bin/sh";
    childArgv[childArgc++] = "-sh";
    childArgv[childArgc++] = "-c";
    childArgv[childArgc++] = buff;
} else {
    char tbuf[PATH_MAX + 2], *p;

    tbuf[0] = '-';
    xstrncpy(tbuf + 1, ((p = strrchr(pwd->pw_shell, '/')) ?
                p + 1 : pwd->pw_shell), sizeof(tbuf) - 1);

    childArgv[childArgc++] = pwd->pw_shell;
    childArgv[childArgc++] = xstrdup(tbuf);
}

childArgv[childArgc++] = NULL;

execvp(childArgv[0], childArgv + 1);

if (!strcmp(childArgv[0], "/bin/sh"))
    warn(_("couldn't exec shell script"));
else
    warn(_("no shell"));

exit(EXIT_SUCCESS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...