标准输出/标准输入和参数
我的程序有点问题,我不知道如何解决它。只要我不包含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;
}
在你的榜样的问题无关与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解决方案)
非常感谢!我没有想到这一点。睡眠只是模拟了我需要计算我想要发送的值的时间,但它现在可以工作 – Mossi
并且正在运行'./Server -f72'发出正确的数字? –
是的。我在另一个程序中也使用它,参数很重要,程序在哪个管道上打印参数字符串。 – Mossi
所以这个例子上面的作品?在这种情况下,它不是[mcve]。你确定你的其他程序不使用'stderr'而不是'stdout'?您必须发布真实案例和控制台输出。你真的确定'getopt'是罪魁祸首吗?因为我严重怀疑它。 –