программа работает на max osx нормально и в linux ненормально - PullRequest
0 голосов
/ 07 ноября 2010

Я был недавно очень занят проектом над операционными системами .. Я работаю над своими Mac и все идет отлично .. Когда я пытался запустить ту же программу на ПК с Linux, программа работала ужасно неправильно ... . Например, fgets и fscanf бегло работают на Mac, но когда я пытаюсь fgets 2 раза подряд из stdin (сначала перематывая stdin), я не получаю то, что хочу в linux, хотя на моем mac evertyhting работает нормально, как expexted .. Пожалуйста, помогите мне, если я пропускаю какую-либо информацию о Linux и проблемах ..

void add_new_account(int sd)
{
    int my_id, next_id;
    struct drivers instance; 

    read(sd, &next_id, sizeof(int));
    if (next_id >= 1000) {
        printf("system is full .. we are sorry for this inconvenience\n");
        exit(0);
    }

    read(sd, buf, sizeof(buf));
    printf("%s\n", buf);

    rewind(stdin);
    fgets(instance.driver_name, sizeof(instance.driver_name), stdin);

    rewind(stdin);
    fgets(instance.password, sizeof(instance.password)+1, stdin);

    write(sd, &instance, sizeof(instance));
    read(sd, &my_id, sizeof(int));
    printf("your unique id is %d! please save it in order to login with it\n", my_id);
}

1 Ответ

4 голосов
/ 07 ноября 2010

Не следует перематывать stdin, так как это не гарантирует работу. Невозможно точно сказать, что происходит, не видя никакого кода, но я предполагаю, что вы пытаетесь перематывать stdin с помощью fseek (или одного из его родов, таких как fsetpos или rewind), и этот вызов не выполняется.

Обычные файловые объекты доступны для поиска, но другие типы файловоподобных объектов, такие как сокеты и FIFO, обычно не доступны для поиска. В вашем ограниченном случае вы, вероятно, замечаете, что Mac OS X буферизует достаточно данных, чтобы вы могли найти их по своему вкусу, но Linux этого не делает.

Вам следует переписать вашу программу, чтобы вам не нужно было перематывать stdin. Вы могли бы сделать это, выполнив свою собственную буферизацию - считывать данные в буфер в вашем приложении, а затем считывать данные из этого буфера (возможно, несколько раз, если это необходимо). Тогда вам не нужно зависеть от перемотки входного потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...