标准输出/标准输入和参数

问题描述:

我的程序有点问题,我不知道如何解决它。只要我不包含getopt(没有参数),我的程序就能正常工作。标准输出/标准输入和参数

我写了2个简单的程序服务器&客户

服务器在stdout写数字和客户应stdin阅读。

此外程序应该能够用参数(参数)调用。

例如程序的调用看起来像这样:

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

如果我运行该程序,然后它只是打印“她是R”的说法“22”和“等待服务器“,但它应该从服务器打印号码

我无法找到错误。我将衷心感谢您的帮助。预先感谢所有读过这些内容的人。

服务器:

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; 
} 
+0

并且正在运行'./Server -f72'发出正确的数字? –

+0

是的。我在另一个程序中也使用它,参数很重要,程序在哪个管道上打印参数字符串。 – Mossi

+0

所以这个例子上面的作品?在这种情况下,它不是[mcve]。你确定你的其他程序不使用'stderr'而不是'stdout'?您必须发布真实案例和控制台输出。你真的确定'getopt'是罪魁祸首吗?因为我严重怀疑它。 –

在你的榜样的问题无关与getopt。这是关于输出缓冲

如果您等待足够长时间,应该一次出现一连串的数字。

我使它通过修改服务器程序

  • fprintf

  • 之后去除所述sleep(1)

  • ,或者使用fflush(stdout);当终端打印工作时,输出被刷新时换行遇到,这解释了它为什么起作用。

  • 在重定向输出中打印时,会发生缓冲。您必须明确清空缓冲区(C库可以决定是否刷新,但这不是这里发生的)

您无法控制客户端。即使管道服务器more不适用于你的情况。

读也在这里:Does reading from stdin flush stdout?

注意:您可以愚弄你的服务器程序,以为它写在tty,这是一个有点哈克但可以工作:

Pretend to be a tty in bash for any command

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

+0

非常感谢!我没有想到这一点。睡眠只是模拟了我需要计算我想要发送的值的时间,但它现在可以工作 – Mossi