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);

}

には 2 つのケースがあり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);

}

ケース 1 では、 を実行./Parentしてから「Hello World」と入力すると、「Hello World」のエコーが 2 回表示されます。1 つは子プログラムからのもので、もう 1 つは親プログラムからのものです。

ケース 2 で、 を実行./Parentしてから「Hello World」と入力すると、「Hello World」のエコーが 1 つ表示され、子プロセスから入力プロンプトが表示されます。このプロンプトで「Goodbye」と入力すると、「Goodbye」のエコーが返されます。

Parent.cケース 1 で現在発生しているのと同じ動作をケース 2 で取得するには、どうすれば変更できますか?

4

1 に答える 1

1

簡単な答えは: できません。

getpassマニュアルページから:

getpass ()関数は/dev/tty(プロセスの制御端末) を開き、文字列プロンプトを出力し、エコーをオフにし、1 行 (「パスワード」) を読み取り、端末の状態を復元して/dev/tty再び閉じます。

つまり、標準入力からではなく、端末デバイスから直接読み取ります。

于 2013-03-01T07:15:29.920 に答える