假设我有以下短程序,我将称之为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中出现的相同行为?
答案 0 :(得分:1)
简单的答案是:你不能。
getpass()功能打开
/dev/tty
(进程的控制终端),输出字符串提示,关闭回显,读取一行(“密码”),恢复终端状态并再次关闭/dev/tty
。
这意味着它直接从终端设备读取,而不是从标准输入读取。