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中相同的行为?
如果从/ dev/tty的读取,是有一些黑客,使家长写来的tty读取,或具有父诱骗儿童到行为,好像之前的/ dev/tty的实际上是一个管父控制? – merlin2011 2013-03-01 07:25:46
@ merlin2011不是,'/ dev/tty'只是_current_进程的终端。事先不能知道它真的会是哪个伪终端。你可能不得不重新思考你的想法,特别是(也来自'getpass'手册页):“这个函数已经过时了,不要使用它。” – 2013-03-01 07:33:07
它是什么现代等价物? – merlin2011 2013-03-01 07:37:34