C中的gethostname(2)

时间:2012-08-06 03:20:17

标签: c io

我开发了一个接受stdin文本的迷你shell。它到目前为止工作,但我需要让它返回(在>之前的小东西)

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

我有

#include <unistd.h>

在代码中,当前的工作目录是使用getcwd(2)得到的,它运行正常,但gethostname(2)似乎不起作用。它不会在MINGW32上使用gcc编译,给出错误:未定义的引用到'gethostname'collect2:ld重新出现1退出状态。

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

#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;
}

欢迎任何批评和评论:)

1 个答案:

答案 0 :(得分:5)

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

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

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

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

如果您看到主机名,则需要注意该呼叫可能会失败。您应该检查gethostname的返回值(以及errno),看看是否属于这种情况。

您可能还想澄清“您似乎没有工作”的含义。它崩溃了吗?它会给你一个空字符串吗?它会为您提供您认为不正确的非空字符串吗?你只是感到困惑,因为在提示之前只输出了一个字符串(参见上面的修复程序)?

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


根据您添加的文字:

  

它不会在MINGW32上使用gcc进行编译,给出错误:未定义引用'gethostname'colle2:ld reurned 1退出状态。

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

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

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

此外,在MinGW下,你可能发现你需要使用WinSock(包括winsock2.h并在调用任何网络功能之前调用WSAStartup())。我在MinGw尝试过这段时间已经有一段时间,但我似乎记得这是一个要求(它可能已经改变)。