我开发了一个接受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;
}
欢迎任何批评和评论:)
答案 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尝试过这段时间已经有一段时间,但我似乎记得这是一个要求(它可能已经改变)。