我的程序有点问题而且我不知道如何解决它。只要我不包含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;
}
答案 0 :(得分:1)
示例中的问题与getopt
无关。它是关于输出缓冲。
如果你等了足够长的话,一次就会出现一连串的数字。
我通过修改服务器程序
使其工作sleep(1)
或在fflush(stdout);
fprintf
在终端中打印时,遇到换行符时会刷新输出,这就解释了它的工作原理。
您无法从您的客户端控制它。即使将服务器连接到more
也无法正常工作。
另请阅读:Does reading from stdin flush stdout?
注意:你可以欺骗你的服务器程序,使其相信它在tty
中写作,它有点hacky但可以工作:
Pretend to be a tty in bash for any command
(我目前没有Windows解决方案)