Я пытаюсь выяснить, как программа 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);