2

我开发了一个接受来自标准输入的文本的迷你外壳。到目前为止它有效,但我需要让它返回(在>之前的小东西中)

他们登录的机器名称和当前工作目录。

我有

#include <unistd.h>

在代码中,当前工作目录是使用 getcwd(2) 获得的,它工作正常,但 gethostname(2) 似乎不起作用。它不会在 MINGW32 上使用 gcc 进行编译,给出错误:未定义的对 'gethostname' collect2 的引用:ld reurned 1 exit status。

到目前为止,这是我的代码。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

static int LINE_MAX = 10000;
static char *cmdLine = "Samcmd --> ";


int main( int argc, char *argv[] )
{
    char cwd[LINE_MAX];
    char hostName[LINE_MAX];
    int looper = 1;
    char *token = NULL;
    char line[LINE_MAX];
    char *placehold = NULL;

    getcwd(cwd, LINE_MAX - 1);
    gethostname(hostName, LINE_MAX - 1);
    while ( looper == 1 )
    {
        printf( "%s | %s", hostName, cmdLine );
        if( fgets( line, LINE_MAX, stdin ) != NULL )
        {
            token = strtok( line, ";" );
            do{
                if( strcmp(token, "exit\n") == 0 ) /*if an exit command is issued*/
                {
                    looper = 0;
                }
                system(token);
                token = strtok( NULL, ";" );
            } while ( token != NULL );
        }
    }
    return 0;
}

欢迎任何批评和评论:)

4

1 回答 1

5

这在我的系统上工作正常,打印主机名,然后是提示符。它不会打印当前的工作目录,但这只是因为它不在 中printf,这更适合:

printf( "%s | %s | %s", hostName, cwd, cmdLine );

在我的系统上,这给了我:

paxbox01 | /home/pax/Pax | Samcmd -->

如果您没有看到主机名,则需要注意调用可能会失败。您应该检查gethostname(连同errno)的返回值,看看是否是这种情况。

您可能还想澄清“似乎不起作用”的意思。它会崩溃吗?它会给你一个空字符串吗?它是否给您一个您认为不正确的非空字符串?您是否只是因为在提示之前只输出了一个字符串而感到困惑(有关此问题的修复,请参见上文)?

这将极大地帮助这里的任何人帮助您。


根据您添加的文字:

它不会在 MINGW32 上使用 gcc 进行编译,给出错误:未定义对 'gethostname' collect2 的引用:ld reurned 1 exit status。

我认为您需要在 MinGW 中链接一个额外的库。MinGW 并不意味着提供 UNIX 的所有功能(例如,CygWin 试图这样做)。更多的是提供gcc构建 Windows 应用程序的工具链。

您应该将-lws2_32选项添加到您的编译器行(在末尾),以便它引入ws2_32库,这是代码所在的gethostname位置。

或者,Win32 API 包括GetComputerNameEx我认为没有额外链接要求的,尽管此时您的代码当然是不可移植的。

另外,在MinGW下,你可能会发现需要用到WinSock(在调用任何网络函数之前先包含winsock2.h和调用)。WSAStartup()自从我在 MinGw 下尝试这个已经有一段时间了,但我似乎记得这是一个要求(它可能已经改变)。

于 2012-08-06T03:27:22.527 回答