Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 标准输出/标准输入和参数_C_Pipe_Stdout_Stdin_Getopt - Fatal编程技术网

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

C 标准输出/标准输入和参数,c,pipe,stdout,stdin,getopt,C,Pipe,Stdout,Stdin,Getopt,我的程序有点小问题,我不知道如何解决。只要不包含getopt(无参数),我的程序就可以正常工作 我写了两个简单的程序服务器和客户端 服务器在stdout中写入数字,客户端应使用stdin读取数字 此外,程序应该能够被参数调用 例如,程序调用如下所示: Terminal: ./Server -f72 | ./Client -r22 int main(int argc , char *argv[]) { int i; FILE *ziel; ziel=stdout;

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

我写了两个简单的程序服务器和客户端

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

此外,程序应该能够被参数调用

例如,程序调用如下所示:

Terminal: ./Server -f72 | ./Client -r22
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;
}
如果我运行这个程序,它只会打印带有参数“22”和“等待服务器”的“Her is r”,但它应该打印来自服务器的数字

我找不到这个错误。我非常感谢你的帮助。提前感谢所有读到这篇文章的人

服务器:

Terminal: ./Server -f72 | ./Client -r22
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;
}
客户端:

Terminal: ./Server -f72 | ./Client -r22
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;
}
intmain(intargc,char*argv[])
{
文件*cl;
cl=stdin;
int i;
int-zahl[10];
int选项;
char-buf[50];
while((option=getopt(argc,argv,“f:tr:”)!=-1)
{
开关(选件)
{
案例“f”:
puts(“这里是f”);
strcpy(buf、optarg);
put(buf);
打破
案例“t”:
puts(“这是t”);
打破
案例“r”:
puts(“这是r”);
strcpy(buf、optarg);
put(buf);
打破
违约:
printf(“错误”);
退出(退出失败);
}
}
puts(“等待服务器”);

对于(i=0;i您的示例中的问题与
getopt
无关。它与输出缓冲有关

如果你等待的时间足够长,一次过就会出现一连串的数字

我通过修改服务器程序使其工作

  • 删除
    睡眠(1)
  • 或者在
    fprintf之后使用
    fflush(stdout);

  • 在终端中打印时,遇到换行符时会刷新输出,这就解释了它工作的原因

  • 在重定向输出中打印时,会发生缓冲。您必须显式地刷新缓冲区(C库可以决定无论如何刷新,但这里不是这样)
您无法从客户端控制这一点。在您的情况下,即使通过管道将服务器连接到
more
也不起作用

请在此阅读:

注意:您可能会愚弄您的服务器程序,使其相信它是在
tty
中编写的,这有点黑客行为,但可以工作:


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

然后运行
/Server-f72
发出正确的数字?是的。我也在另一个程序中使用它,其中参数很重要,程序(在哪个管道上)只打印参数字符串。那么上面的示例可以工作吗?在这种情况下,它不是一个。你确定你的其他程序没有使用
stderr
而不是
吗>stdout
?你必须发布真实的案例和控制台输出。你真的确定
getopt
是罪魁祸首吗?因为我非常怀疑。我昨天已经做了。这个例子不起作用。我确定我使用了stdout,我定义了一个指向它的指针。如果你不相信我,我可以发布一些终端屏幕截图。我相信你有一个问题,你不会发布一个问题来打扰我们:)我对复制机和原因有疑问,仅此而已。非常感谢!!!我没有想到。睡眠只是模拟了我需要计算我想要发送的值的时间,但它现在起作用了