如何从父进程写入getpass()输入?

时间:2013-03-01 07:04:49

标签: c linux input passwords popen

假设我有以下短程序,我将称之为Parent.c

#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”的回声。一个来自儿童计划,一个来自父计划。

如果是两个,如果我运行./Parent,然后输入“Hello World”,我会得到一个“Hello World”的回显,然后从子进程获得一个输入提示。 如果我在这个提示符下输入“Goodbye”,我会得到“Goodbye”的回音。

如何修改Parent.c以获得案例2中当前在案例1中出现的相同行为?

1 个答案:

答案 0 :(得分:1)

简单的答案是:你不能。

来自getpass manual page

  

getpass()功能打开/dev/tty(进程的控制终端),输出字符串提示,关闭回显,读取一行(“密码”),恢复终端状态并再次关闭/dev/tty

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