我通过运行“man openvt”命令检查 openvt 手册,并在“另请参阅”部分下找到了 doshell(8):
但如果我执行“man 8 doshell”,则没有手册:
我查看了在线手册http://linux.about.com/library/cmd/blcmdl1_openvt.htm, 这多贝壳(8)不是链接:
我发现有人提到“(还有古老的doshell(8)”,回答于https://stackoverflow.com/questions/21428158/how-to-send-broadcast-message-to-console-in-linux-from-c-program
只是出于我的好奇心,有什么地方可以找到有关 doshell(8) 的信息吗?
答案1
我不确定(已经有一段时间了),但在我看来,这是对旧 Linux 例程(1992)的引用:ftp://ftp2.de.freebsd.org/pub/linux/tsx-11/sources/usr.bin/doshell.c:
#include <stdio.h>
#include <sys/file.h>
#include <errno.h>
extern char *sys_errlist[];
main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, "usage: doshell <ttyname> <shellname> &\n");
exit(1);
}
/* close down fd's */
close(0);
close(1);
close(2);
/* detach from parent process's group */
setsid();
/* open new tty */
if (open(argv[1], O_RDWR, 0) == -1)
exit(2);
dup(0);
dup(0);
execlp(argv[2], "-", 0);
/* should appear on new tty...: */
fprintf(stderr, "can't exec shell: %s\n", sys_errlist[errno]);
exit(3);
}
它也可能指旧的 Minux 例程:http://users.sosdg.org/~qiyong/mxr/source/commands/mail/mail.c#L702
void doshell(command)
char *command;
{
int waitstat, pid;
char *shell;
if (NULL == (shell = getenv("SHELL"))) shell = SHELL;
if ((pid = fork()) < 0) {
perror("mail: couldn't fork");
return;
} else if (pid != 0) { /* parent */
wait(&waitstat);
return;
}
/* Child */
setgid(getgid());
setuid(getuid());
umask(oldmask);
execl(shell, shell, "-c", command, (char *) NULL);
fprintf(stderr, "can't exec shell\n");
exit(127);
}
这两个例程似乎都具有 stackoverflow 答案中描述的功能,并且第一个例程似乎不太可能源自第二个例程。