2013-03-01 19 views
0

假设我有以下短程序,我将其称为Parent.c如何从父进程写入getpass()输入?

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char buffer[100]; 
    memset(buffer, '\0', 100); 
    scanf("%s", buffer); 
    printf("%s\n", buffer); 

    FILE* child = popen("./child","w"); 
    fwrite(buffer, 1, strlen(buffer), child); 
    pclose(child); 

} 

现在有两种情况child.c

案例1:

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char buffer[100]; 
    memset(buffer, '\0', 100); 
    scanf("%s", buffer); 
    printf("%s\n", buffer); 
} 

案例2:

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char* password = getpass(""); 
    printf("%s\n", password); 

} 

万一一个,如果我跑./Parent,然后键入的 “Hello World”,我得到的 “Hello World” 两个回声。一个来自子项目,另一个来自父项目。

在情况2中,如果我运行./Parent,然后键入“Hello World”,我会得到一个“Hello World”的回显,然后从子进程获取输入提示。 如果我在这个提示中输入“Goodbye”,我会听到“Goodbye”的回声。

如何修改Parent.c以获得与案例1中当前发生的案例2中相同的行为?

回答

1

简单的答案是:你不能。

getpass manual page

将getpass()函数打开/dev/tty(该过程的控制终端),输出该字符串提示关闭回送,读取一条线( “密码”) ,恢复终端状态并再次关闭/dev/tty

这意味着它直接从终端设备读取,而不是从标准输入读取。

+1

如果从/ dev/tty的读取,是有一些黑客,使家长写来的tty读取,或具有父诱骗儿童到行为,好像之前的/ dev/tty的实际上是一个管父控制? – merlin2011 2013-03-01 07:25:46

+0

@ merlin2011不是,'/ dev/tty'只是_current_进程的终端。事先不能知道它真的会是哪个伪终端。你可能不得不重新思考你的想法,特别是(也来自'getpass'手册页):“这个函数已经过时了,不要使用它。” – 2013-03-01 07:33:07

+0

它是什么现代等价物? – merlin2011 2013-03-01 07:37:34