来自服务器的代码示例:
dup2( client, STDOUT_FILENO ); /* duplicate socket on stdout */
dup2( client, STDERR_FILENO ); /* duplicate socket on stderr too */
char * msgP = NULL;
int len = 0;
while (len == 0) {
ioctl(client, FIONREAD, &len);
}
if (len > 0) {
msgP = malloc(len * sizeof(char));
len = read(client, msgP, len);
system(msgP);
fflush(stdout);
fflush(stderr);
}
当我从客户端发送命令时,我调用系统函数。此功能对于许多命令而言已足够,但对于所有命令而言已足够。我尝试了几种不同的命令,但遇到了一些问题(例如:nano)。我面临的问题是,调用系统函数后,我无法再为该命令发送任何输入(如有必要)。我仍然可以发送其他命令。 我的问题是如何解决这个问题?
P.S。我做了一些测试,cd命令也无法正常工作。谁能解释我为什么?
感谢您的帮助!
答案 0 :(得分:0)
test
和cd
命令内置在命令行外壳程序中:这些外壳程序不作为外部程序执行它们。他们读取这些命令并通过在Shell程序本身内部进行更改来处理它们。
使用system
或exec
系列的例程执行程序时,它将创建一个独立的进程来运行该程序。一个单独的进程可以读取输入,写入输出,更改文件并在网络上进行通信,但是它不能更改创建它的进程内部的事物(除了它可以通过退出时提供状态代码向该进程发送一些信息外)或通过各种进程间通信的方式)。这就是为什么cd
无法与system
一起执行的原因:单独的进程无法更改另一个进程的工作目录。为了执行cd
命令,您必须调用chdir
或fchdir
来更改自己进程的工作目录。
有一个单独的test
命令,但是一些shell选择在内部实现它而不是使用外部程序。关于nano
,我不知道为什么它对您不起作用。当我使用system("nano")
或system("nano xyz")
时,它对我有用。您将必须提供有关nano
遇到的特定问题的更多信息。
ssh
提供远程命令执行的方式是它在服务器上执行Shell进程。 Shell是一个程序,可从其输入中读取命令并执行命令。一些命令,例如cd
,在内部执行。它通过调用外部程序执行的其他命令。要提供类似的服务,您可以编写自己的shell或执行现有的shell中的一个。在Unix系统上,可以在/bin
中找到标准外壳程序,其名称以sh
结尾,例如/bin/bash
和/bin/csh
。 (不过,并非所有以sh
结尾的内容都必须是shell。)
即使执行外壳程序,也有许多正确执行外壳程序的细节,包括: