我怎样才能替换系统功能?

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 命令也不起作用。谁能解释一下为什么?

感谢您的帮助!

testcd 命令内置于命令行 shells:shells 不会将它们作为外部程序执行。他们读取这些命令并通过在 shell 程序本身内部进行更改来处理它们。

当您使用 system 执行程序或 exec 家族的例程时,它会创建一个单独的进程来运行该程序。一个单独的进程可以读取输入、写入输出、更改文件和在网络上通信,但它不能更改创建它的进程内部的东西(除了它可以通过在退出时提供状态代码来向该进程发送一些信息)或通过各种进程间通信方式)。这就是为什么cd不能和system一起执行的原因:一个单独的进程不能改变另一个进程的工作目录。为了执行 cd 命令,您必须调用 chdirfchdir 来更改您自己进程的工作目录。

有一个单独的 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。