0

私は昨夜からこの問題に悩まされていました.2番目の新鮮な目が助けになることを願っています.

問題は、無効な入力がuserIn関数に入力された場合 (1 から 99 までの数値ではないもの)、while ループの最後のテスト printf がmain"ERR = 1" を出力し、while がループしてuserIn再度呼び出されることです。 . ここまでは順調ですが、有効な入力が入力されると、while ループの最後にテスト printf が出力され、"ERR = 0" が出力され、プログラムがハングします。「HELLO」というテスト printf が印刷されません。

理由についての提案は大歓迎です。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void userIn (int *x)
    {
    char b;
    printf("Please enter a new value for Vm: ");
    scanf(" %i",x);
    while (((b=getchar())!='\n')&&(b!=EOF));
    return; 
    }
int main (void)
    {
    int  fd, x, err;
    char *npipe = "/tmp/fms",
         input[3];
    struct stat info;
    printf("\n");

    //get user input
    err = 1;
    while (err)
        {
        userIn(&x);
        if (x > 0 && x < 100) err = 0;
        //else printf("\033[1A\033[K");

        printf("ERR = %i\n",err);//TEST PRINTF
        }
    printf("HELLO");//TEST PRINTF

    //if pipe exists
    if ( (!lstat(npipe,&info)) && (S_ISFIFO(info.st_mode)) )
        {
        sprintf(input,"%i",x);
        //write user input to named pipe created by 'parent.c'
        fd = open(npipe, O_WRONLY);
        write(fd, input, sizeof(input));
        close(fd);
        }
    else printf("\033[0;31mNamed pipe doesn't exist, %i not passed.\n\n\033[0m",x);
    return 0;
    }
4

2 に答える 2

2

あなたの直感に反して、プログラムは行の後のどこかでフリーズしますprintf("HELLO");。そのprintfには改行がないため、HELLOバッファリングされ、すぐに端末にフラッシュされません。

あなたのパイプのもう一方の端から読み取るプロセスはありますか?

于 2012-12-13T18:53:30.817 に答える
1

システムでコードを実行すると、出力は次のようになります。

Please enter a new value for Vm: 101
ERR = 1
Please enter a new value for Vm: 1
ERR = 0
HELLONamed pipe doesn't exist, 1 not passed.

つまり、ループはあなたがそうすべきだと思ったときに正確に終了します。もちろん、/tmp/fms私のシステムには存在しないため、コードはすぐに終了します。

ただし、 を作成する /tmp/fmsと、次のように表示されます。

Please enter a new value for Vm: 1
ERR = 0

...そして追加の出力はありません。これは、printfステートメントからの出力がバッファリングされ、名前付きパイプへの書き込みがブロックされているため、出力がフラッシュされないためです。a を printf に追加する\nと、おそらく期待どおりに表示されます。

于 2012-12-13T18:55:09.320 に答える