2

stdinからのテキストを受け入れるミニシェルを開発しました。これまでは機能しますが、元に戻す必要があります(>の前の小さなことで)

ログインしているマシン名AND現在の作業ディレクトリ。

私は持っています

#include <unistd.h>

コード内で、現在の作業ディレクトリはgetcwd(2)を使用して取得されました。これは正常に機能しましたが、gethostname(2)は機能していないようです。MINGW32でgccを使用してコンパイルされないため、エラーが発生します。「gethostname」への未定義の参照w collect2:ld reurned 1exitstatus。

これが私のコードです。

#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、これが当てはまるかどうかを確認する必要があります。

また、「機能していないように見える」とはどういう意味かを明確にすることもできます。クラッシュしますか?それはあなたに空の文字列を与えますか?それはあなたが間違っていると思う空でない文字列をあなたに与えますか?プロンプトの前に1つの文字列しか出力されなかったため、単に混乱していますか(これに対する修正については上記を参照してください)。

これは、ここにいる人があなたを助けるのに大いに役立ちます。


追加したテキストに基づく:

MINGW32でgccを使用してコンパイルされないため、エラーが発生します。「gethostname」への未定義の参照collect2:ld reurned 1exitstatus。

MinGWの追加ライブラリとリンクする必要があると思います。MinGWは、UNIXのすべての機能を提供することを意図したものではありません(たとえば、CygWinが提供しようとしているように)。gccWindowsアプリケーションを構築するためのツールチェーンを提供するだけではありません。

-lws2_32コンパイラ行(最後)にオプションを追加してws2_32、のコードgethostnameが配置されているライブラリを取り込む必要があります。

あるいは、Win32 APIにはGetComputerNameEx、追加のリンク要件はないと私が信じているものが含まれていますが、その時点ではもちろんコードは移植できません。

さらに、MinGWでは、WinSockを使用する必要がある場合があります(ネットワーク関数を呼び出す前にインクルードて呼び出します)winsock2.hWSAStartup()MinGwでこれを試みてからしばらく経ちましたが、それが要件だったことを思い出しているようです(変更されている可能性があります)。

于 2012-08-06T03:27:22.527 に答える