程序在max osx上正常运行,在linux中异常运行

时间:2010-11-07 00:34:08

标签: c linux macos

我最近一直忙于操作系统上的一个项目..我在我的mac上工作,一切都很好..当我试图在运行linux的电脑上运行相同的程序时,程序非常错误.. 。例如fgets和fscanf在mac上流畅地工作但是当我尝试从stdin连续fgets 2次(首先倒回stdin)我得不到我想要的linux,即使在我的mac evertyhting正常运行时被驱逐出去..如果我错过了有关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 个答案:

答案 0 :(得分:4)

你不应该回放stdin,因为它不能保证工作。如果没有看到任何代码,就不可能确切地说出发生了什么,但我猜你正试图用fseek(或其中一个亲属,如fsetpos或{{}来回放stdin。 3}})并且该呼叫失败。

常规文件对象是可搜索的,但其他类型的文件类对象(如套接字和FIFO)通常是不可搜索的。在您的有限情况下,您可能会观察到Mac OS X正在缓冲足够的数据供您根据自己的喜好进行搜索,但Linux并没有这样做。

您应该重写您的程序,这样您就不需要回放stdin。您这样做的方法是将您自己的缓冲读取数据放入应用程序的缓冲区中,然后从该缓冲区中读取数据(如果需要,可能需要多次)。然后,您不需要依赖可重新连接的输入流。