【问题标题】:how can i replace the system function?如何更换系统功能?
【发布时间】:2018-12-01 11:22:30
【问题描述】:

来自服务器的代码示例:

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)。我面临的问题是,在调用系统函数后,我无法再为该命令发送任何输入(如有必要)。我仍然可以发送其他命令。 我的问题是如何解决这个问题?

附:我做了一些测试,cd 命令也不起作用。谁能解释一下为什么?

感谢您的帮助!

【问题讨论】:

  • 多阅读。你应该花几个星期的时间阅读更多。首先阅读您正在使用的 每个 函数的文档。你的问题不够清楚。提供一些minimal reproducible example。还可以阅读一本不错的 Linux 编程书籍,也许是旧的 Advanced Linux Programming
  • StackOverflow 不是我的家庭作业服务。在这里提问之前,您应该做一些研究。
  • 请正确格式化您的问题并纠正语法错误。

标签: c unix client-server system


【解决方案1】:

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

当您使用systemexec 系列中的例程执行程序时,它会创建一个单独的进程来运行该程序。一个单独的进程可以读取输入、写入输出、更改文件并在网络上进行通信,但它不能更改创建它的进程内部的内容(除了它可以通过在退出时提供状态码来向该进程发送一些信息或通过各种进程间通信方式)。这就是为什么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。

【讨论】:

  • 306/5000 谢谢。非常有用。以及“纳米”问题如何:我想从客户端更改文件。使用 nano 文件,我能够打开编辑器并获得答案,但我无法再编辑它,因为我从客户端发送的任何输入都被视为系统函数的参数。
  • 现在我唯一的问题是如何将 msgP 中的字符串发送到标准输入?
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
相关资源
最近更新 更多