【发布时间】:2014-06-18 22:43:08
【问题描述】:
我想打开一个 bash 应用程序(prog1)并使用 C 程序向该应用程序发送命令。 我尝试并编写了以下代码。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
FILE * fp;
char message[10] = "command1\n";
fp = popen("sudo prog1","r");
write(STDIN_FILENO, message, 10);
pclose(fp);
execlp("sudo prog1", "sudo prog1", "-l", NULL);
return 0;
}
这段代码给出了一个输出:
Linux:~$ ./ prog 2 // running the code
command // prints "command"
prog1-> // Then opens "prog1" (prog1 waits for user commands)
但我希望它是
Linux:~$ ./ prog 2 // running the code
prog1-> command // open "prog1" and write command (instead of getting it from user)
它要么在退出 prog1 之后写入,要么在启动 prog1 之前写入。打开应用程序prog1后,请告诉我如何在prog1中编写“命令”。谢谢。
注意:如果我做
fp = popen("sudo prog1","w"); //to write
它会抛出以下错误 tcgetattr : 不适合设备的 ioctl
【问题讨论】:
-
写入你启动的程序的标准输入,而不是你自己的怎么样?那应该这样做。另外,我认为你的
execlp是一个孤儿,除了你给它不好的论据。或者你有一个名为“sudo prog1”的程序? -
我有一个名为“prog1”的程序,但如果我不包含“sudo”,它会显示“无法打开文件:权限被拒绝”
-
这是一个权限问题,与您提出的问题无关。在开始以普通用户身份工作之前,您是否以 root 身份创建了 prog1? sudo 为您提供命令范围的 root 权限。您可能需要“sudo chown
prog1”,其中 是您的用户名。 -
@user2216209:请仔细阅读。
execlp期望你解析命令行,所以如果你问它,它会尝试执行名为“sudo prog1”的程序。也就是说,程序名称中包含一个空格! -
@Deduplicator:我从程序中删除了“execlp”。