C 如何更换系统功能?

C 如何更换系统功能?,c,unix,client-server,system,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 &

来自服务器的代码示例:

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


谢谢你的帮助

test和
cd
命令内置于命令行shell中:shell不作为外部程序执行它们。它们读取这些命令,并通过在shell程序内部进行更改来处理这些命令

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

阅读更多内容。你应该花几个星期多读书。从阅读您正在使用的每个函数的文档开始。你的问题不够清楚。提供一些。还可以读一本很好的Linux编程书,也许是旧的。StackOverflow不是一个“做我的家庭作业”服务。在这里提问之前,您需要做一些研究。请正确编排您的问题格式并纠正语法错误。306/5000谢谢。非常有用。“nano”问题呢:我想从客户端更改一个文件。使用nano文件,我可以打开编辑器并获得答案,但我无法再编辑它,因为我从客户端发送的任何输入都被作为系统函数的参数。现在我唯一的问题是如何从msgP向stdin发送字符串?