1

プログラムで popen を使用して pppd を起動し、IP アドレスとインターフェース名を簡単に取得できるようにしています。私のコードは独立して正常に動作し、かなり典型的な実装です。問題は、完全なプログラムで実行されたときに始まります (大きすぎて投稿できません)... ループは fgets() 行でかなり長い間ハングしているようです。popen は独自のスレッドで起動され、出力に基づいて管理されます。

popen/pppd のコードは基本的に次のとおりです。

int main(void){
    pthread_create(&thread, NULL, pppd, (char *)NULL);
    pthread_join(thread, NULL);

    return 0;
}

void *pppd(char *args){
    char* command = malloc(32);

    sprintf(command, "pppd %s call %s", dev, provider);
    pppd_stream = popen(command, "r");

    if(pppd_stream == NULL){
        pppd_terminated = TRUE;
        return;
    }

    free(command);

    while(fgets(buffer, 128, d->pppd_stream) != NULL){

        //handle_output
    }

}

CPU 使用率は問題ではありません。システムとプログラムの他の部分はまだ応答性があり、期待どおりに実行されています。

この速度低下の原因について何か考えはありますか?

4

1 に答える 1

0

コマンドがnull で終了する stringであることを確認します。

#define COMMAND_BUFFER_SIZE    256   /* Modify this if you need */

snprintf(command, COMMAND_BUFFER_SIZE, "pppd %s call %s", dev, provider);
command[COMMAND_BUFFER_SIZE - 1] = '\0';
pppd_stream = popen(command, "r");

編集:

あなたをチェックしてくださいfgets

while(fgets(buffer, 128, d->pppd_stream) != NULL){

あなたはこれが欲しいかもしれません:

while(fgets(buffer, 128, pppd_stream) != NULL){
于 2012-08-12T21:14:17.660 に答える