我怎样才能替换系统功能?
how can i replace the system function?
来自服务器的代码示例:
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 命令也不起作用。谁能解释一下为什么?
感谢您的帮助!
test
和 cd
命令内置于命令行 shells:shells 不会将它们作为外部程序执行。他们读取这些命令并通过在 shell 程序本身内部进行更改来处理它们。
当您使用 system
执行程序或 exec
家族的例程时,它会创建一个单独的进程来运行该程序。一个单独的进程可以读取输入、写入输出、更改文件和在网络上通信,但它不能更改创建它的进程内部的东西(除了它可以通过在退出时提供状态代码来向该进程发送一些信息)或通过各种进程间通信方式)。这就是为什么cd
不能和system
一起执行的原因:一个单独的进程不能改变另一个进程的工作目录。为了执行 cd
命令,您必须调用 chdir
或 fchdir
来更改您自己进程的工作目录。
有一个单独的 test
命令,但一些 shell 选择在内部实现它而不是使用外部程序。关于 nano
,我不知道为什么它不适合你。当我使用 system("nano")
或 system("nano xyz")
时它对我有用。您必须提供有关 nano
.
所遇到的具体问题的更多信息
ssh
提供远程命令执行的方式是在服务器上执行一个shell进程。 shell 是一个从其输入中读取命令并执行它们的程序。一些命令,如 cd
,它在内部执行。它通过调用外部程序执行的其他命令。要提供类似的服务,您可以编写自己的 shell 或执行现有的 shell 之一。在 Unix 系统上,标准 shell 可以在 /bin
中找到,名称以 sh
结尾,例如 /bin/bash
和 /bin/csh
。 (不过,并非所有以 sh
结尾的都一定是 shell。)
即使您执行 shell,也有许多细节可以正确执行,包括:
- 确保 shell 的标准输入、标准输出和标准错误流按照您希望的方式连接。
- 正在将所需的环境和命令行参数传递给 shell。
来自服务器的代码示例:
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 命令也不起作用。谁能解释一下为什么?
感谢您的帮助!
test
和 cd
命令内置于命令行 shells:shells 不会将它们作为外部程序执行。他们读取这些命令并通过在 shell 程序本身内部进行更改来处理它们。
当您使用 system
执行程序或 exec
家族的例程时,它会创建一个单独的进程来运行该程序。一个单独的进程可以读取输入、写入输出、更改文件和在网络上通信,但它不能更改创建它的进程内部的东西(除了它可以通过在退出时提供状态代码来向该进程发送一些信息)或通过各种进程间通信方式)。这就是为什么cd
不能和system
一起执行的原因:一个单独的进程不能改变另一个进程的工作目录。为了执行 cd
命令,您必须调用 chdir
或 fchdir
来更改您自己进程的工作目录。
有一个单独的 test
命令,但一些 shell 选择在内部实现它而不是使用外部程序。关于 nano
,我不知道为什么它不适合你。当我使用 system("nano")
或 system("nano xyz")
时它对我有用。您必须提供有关 nano
.
ssh
提供远程命令执行的方式是在服务器上执行一个shell进程。 shell 是一个从其输入中读取命令并执行它们的程序。一些命令,如 cd
,它在内部执行。它通过调用外部程序执行的其他命令。要提供类似的服务,您可以编写自己的 shell 或执行现有的 shell 之一。在 Unix 系统上,标准 shell 可以在 /bin
中找到,名称以 sh
结尾,例如 /bin/bash
和 /bin/csh
。 (不过,并非所有以 sh
结尾的都一定是 shell。)
即使您执行 shell,也有许多细节可以正确执行,包括:
- 确保 shell 的标准输入、标准输出和标准错误流按照您希望的方式连接。
- 正在将所需的环境和命令行参数传递给 shell。