0

假设我有以下短程序,我将其称为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);
}

案例二:

#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”的回声,然后从子进程中得到一个输入提示。如果我在此提示符下键入“再见”,我将得到“再见”的回声。

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

4

1 回答 1

1

简单的答案是:你不能。

getpass手册页

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

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

于 2013-03-01T07:15:29.920 回答