0

我需要关于 fork-server 的帮助。我想要做的是接受一个客户端然后分叉让其他客户端连接,同时将标准输出和错误重定向到客户端。然后客户端应该能够发送应该由位于孙子中的 execlp() 执行的字符串。

我无法找到我的逻辑错误..

在 main() 中:

    while (1) {

        t = sizeof(remote);

        printf("Waiting for connection.\n");

        s2 = accept(s, (struct sockaddr*)&remote, &t);

        if (s2 == -1) {
            perror("accept");
            exit(1);
        } else {

            printf("Client connected.\n");

            if(!fork()) {

                close(1);
                dup(s2);
                handle(s2);
                exit(0);               
            }
            close(s2);
        }
    }

在句柄()中:

    char str[100];
    int n;

    while(1) {

        n = recv(client_socket, str, 100, 0);

        if(n <= 0) {

            perror("recv");
            exit(1);
        } else {

            if(!fork()) {

                execlp("/bin/sh", "sh","­-c", str, NULL);
                exit(1);
            } 
            wait(0);
        } 
    } 

execlp 的结果未重定向到客户端并给出错误“sh: Can't open c”。

4

2 回答 2

1

你应该写:execlp("/bin/sh", "sh","-c", str, NULL);将选项'-c'传递给shell。您传递的选项"c"被解释为:运行c不存在的名为的脚本。

见:http ://unixhelp.ed.ac.uk/CGI/man-cgi?sh

另一件事:您应该在读取字符串后 NUL 终止您的字符串:

if(n > 0)
    str[n] = '\0';

您还应该只读取 99 个字符,因为您将'\0'在字符串末尾写入字符。

于 2013-03-01T14:01:26.180 回答
0

一个可能的原因是您尝试运行的命令不在命令搜索路径中。

另一个原因可能是您获取的字符串包含命令及其参数,并且将其作为单个参数execlp传递给它将作为单个参数传递给 shell,因此它认为整个字符串就是命令。

如果它是最后一个,那么您需要将命令及其参数拆分为一个argv类似的数组,然后使用execvp

正确终止字符串也很重要。连接客户端是否使用终止'\0'字符发送?如果没有,那么您需要自己添加(在这种情况下,您只能接收 99 个字符)。

于 2013-03-01T14:14:47.670 回答