作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我尝试将 login(1)
进程作为我程序的协进程运行。程序应收到登录提示并写入登录名。
login
进程作为协进程很好地启动。但它会在写入登录提示之前立即退出。
该程序的简化版本(删除了写入内容等):
int main( int argc, char** argv )
{
int fd1[2];
int fd2[2];
if(( pipe(fd1) != -1 ) && ( pipe(fd2) != -1 ))
{
const pid_t child_pid = fork();
if( child_pid == 0 )
{
dup2( fd2[0], STDIN_FILENO );
dup2( fd1[1], STDOUT_FILENO );
close( fd1[0] );
close( fd1[1] );
close( fd2[0] );
close( fd2[1] );
execl( "/bin/login", "login", (char*)NULL );
fprintf( stderr, "execl failed\n" );
}
else if( child_pid )
{
char buffer[1000];
ssize_t len;
close( fd1[1] );
close( fd2[0] );
len = read( fd1[0], buffer, sizeof(buffer) - 1 );
if( len > 0 )
fprintf( stderr, "%zd bytes received\n", len );
else if( len == 0 )
fprintf( stderr, "read return zero \n" );
else
fprintf( stderr, "read failed: %V \n", errno );
}
else
{
fprintf( stderr, "Fork failed: %V", errno );
}
}
else
{
fprintf( stderr, "Can not open pipes: %V", errno );
}
return 0;
}
当我运行程序时,结果是:
~ # my_program
read return zero
~ #
如果我用 strace 运行它,我会得到以下结果(删除了很多不相关的行)
~ # strace -f my_program
[pid 4028] read(3, <unfinished ...>
[pid 4030] execve("/bin/login", ["login"], [/* 12 vars */]) = 0
[pid 4030] ioctl(0, TCGETS or SNDCTL_TMR_TIMEBASE, 0x7bc28aec) = -1 EINVAL (Invalid argument)
[pid 4030] exit_group(1) = ?
Process 4030 detached
[pid 4028] <... read resumed> ""..., 999) = 0
[pid 4028] --- SIGCHLD (Child exited) @ 0 (0) ---
[pid 4028] write(2, "read return zero \n"..., 18) = 18
login
进程在 ioctl(STDIN_FILENO, TCGETS,)
调用失败后退出。login
似乎期望输入 fd 是终端或串行线。
有什么方法可以修复我的程序吗?
最佳答案
login
需要 TTY。能够与 login
交互的最简单方法可能是通过 posix_openpt 分配一个伪终端。并传递从站的文件描述符而不是管道句柄。 (但我不是这方面的专家。)
你想做什么?或许更好的方法是通过 PAM 进行身份验证,具体取决于您的用例。
关于c - 作为协进程的登录进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431360/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!