如何更换系统功能?

时间:2018-12-01 11:22:30

标签: c unix client-server system

来自服务器的代码示例:

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命令也无法正常工作。谁能解释我为什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

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

有一个单独的test命令,但是一些shell选择在内部实现它而不是使用外部程序。关于nano,我不知道为什么它对您不起作用。当我使用system("nano")system("nano xyz")时,它对我有用。您将必须提供有关nano遇到的特定问题的更多信息。

ssh提供远程命令执行的方式是它在服务器上执行Shell进程。 Shell是一个程序,可从其输入中读取命令并执行命令。一些命令,例如cd,在内部执行。它通过调用外部程序执行的其他命令。要提供类似的服务,您可以编写自己的shell或执行现有的shell中的一个。在Unix系统上,可以在/bin中找到标准外壳程序,其名称以sh结尾,例如/bin/bash/bin/csh。 (不过,并非所有以sh结尾的内容都必须是shell。)

即使执行外壳程序,也有许多正确执行外壳程序的细节,包括:

  • 确保外壳的标准输入,标准输出和标准错误流按照您希望的方式连接。
  • 将所需的环境和命令行参数传递给shell。