stdout / stdin和参数

时间:2016-12-01 18:20:10

标签: c pipe stdout stdin getopt

我的程序有点问题而且我不知道如何解决它。只要我不包含getopt(没有参数),我的程序就可以正常工作。

我写了两个简单的程序Server& Client

服务器在stdout中写入数字,客户应使用stdin读取数据。

此外,程序应该能够使用参数(参数)进行调用。

例如,该程序的调用如下:

Terminal: ./Server -f72 | ./Client -r22

如果我运行该程序,那么它只是打印"她是r"与#34; 22"和#34;等待服务器",但它应该从服务器打印数字

我无法找到错误。我将衷心感谢您的帮助。提前感谢所有阅读此内容的人。

服务器

int main(int argc , char *argv[])
{
    int i;
    FILE *ziel;
    ziel=stdout;

    int option;
    char buf[50];

    while ((option = getopt(argc, argv,"f:tr:d:j")) != -1)
    {
        switch (option)
        {
            case 'f' :
                strcpy(buf,optarg);
                break;
            case 't' :              
                break;
            case 'r' :
                strcpy(buf,optarg);
                break;
            default:
                //printf("1ERROR");
                exit(EXIT_FAILURE);
        }
    }

    for(i=1;i>0;i++)
    {
        fprintf(ziel,"%d\n",i);
        sleep(1);
    }
    return 0;
}

客户端:

int main(int argc , char *argv[])
{
    FILE* cl;
    cl=stdin;
    int i;
    int zahl[10];
    int option;
    char buf[50];

    while ((option = getopt(argc, argv,"f:tr:")) != -1)
    {
        switch (option)
        {
            case 'f' :
                puts("Here is f");
                strcpy(buf,optarg);
                puts(buf);
                break;
            case 't' :
                puts("Here is t");
                break;
            case 'r' :
                puts("Here is r");
                strcpy(buf,optarg);
                puts(buf);
                break;
            default:
                printf("ERROR");
                exit(EXIT_FAILURE);
        }
    }

    puts("Waiting for Server");
    for(i=0;i<10;i++)
    {
        fscanf(cl,"%d",&zahl[i]);
        printf("Received %d\n ",zahl[i]);

    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

示例中的问题与getopt无关。它是关于输出缓冲

如果你等了足够长的话,一次就会出现一连串的数字。

我通过修改服务器程序

使其工作
  • 删除sleep(1)
  • 或在fflush(stdout);

  • 之后使用fprintf
  • 在终端中打印时,遇到换行符时会刷新输出,这就解释了它的工作原理。

  • 在重定向输出中打印时,会发生缓冲。你必须明确刷新缓冲区(无论如何C库都可以决定刷新,但这不是这里发生的事情)

您无法从您的客户端控制它。即使将服务器连接到more也无法正常工作。

另请阅读:Does reading from stdin flush stdout?

注意:你可以欺骗你的服务器程序,使其相信它在tty中写作,它有点hacky但可以工作:

Pretend to be a tty in bash for any command

(我目前没有Windows解决方案)