如何响应用`system`启动的程序的提示?

时间:2013-07-13 11:42:14

标签: c

我知道如何将参数传递给system,例如:

char words[]="abcde";
sprintf(str, "echo %s",words);
system(str);

我写了一个简单的代码来破解rar文件。

但是当出现提示时,我不知道如何将密码传递给system

我试试下面的代码

char pw[512];
for(int i=0;i<26;i++){
    char ch=i+'a';

    memset(pw, '\0', sizeof(512));
    system("unrar x filename");// prorgam will wait at this point for a password
    sprintf(pw, "%c",ch);   
    system(pw); //this line doesn't make sense....
}

当程序等待输入时,如何将该数据传递给system

2 个答案:

答案 0 :(得分:4)

如果要直接与指定的命令交互,则不能使用system(),因为它在system()描述中指出system()在指定的命令完成之前不会返回:{ {3}}

正如Marcelo所说,如果您想要发送数据的程序接受命令行参数,只需在命令行中指定传递给system()的数据。如果要调用的程序在stdin上获取数据的另一种方法是将数据保存到临时文件,然后在命令行上指定stdin重定向,则在system()返回后删除文件:

char *inputFileName = mkstemp("/tmp/myinputXXXXXX");
// store data in inputFileName
char buf[128];
sprintf(buf, "/path/to/myprogram < %s", inputFileName);
system(buf);
unlink(inputFileName);

如果需要与运行的程序进行交互,则需要使用另一组库函数来启动进程并在它们之间建立IPC机制。 std库具有类似于system()的功能,可以执行此操作:popen()popen()允许您指定类似于system()的命令行,但它会为创建的程序创建一个管道并返回一个FILE *,它允许您的调用程序读取,写入或同时读取/写入数据子:

FILE *myprogFP = popen("/path/to/myprog", "rw");
fprintf(myprogFP, "%d\n", i);
pclose(myprogFP);

有关从这些函数返回错误的更多信息和示例,请参阅例如:http://www.tutorialspoint.com/c_standard_library/c_function_system.htm

答案 1 :(得分:3)

Unrar允许您提供密码作为命令行的一部分:

for (char ch = 'a'; ch <= 'z'; ++ch) {
    char cmdline[512];
    sprintf(cmdline, "unrar -p%c x filename", ch);
    system(cmdline);
}