如何使用C和linux从用户那里获得键盘输入?

问题描述 投票:0回答:1

我要做一个简短的程序,创建两个子进程,每个子进程接受来自键盘的整数,并将它们写入一个管道,由父进程将它们汇总并在屏幕上显示总数。

我已经用scanf()写了一个,但它冻结了,而且它没有给我总数。 如果可能的话,我如何用scanf或其他方法使它工作?

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int pipe(int pd[2]);
int main(int argc, char *argv[])
{

    int pd[2], sum=0, num=0;
    if(pipe(pd) == -1)
    for(int i = 0; i < 2; i++)
    {
        if(fork() == 0)
        {
            scanf("%d", num);
            if(write(pd[1], &num, sizeof(int)) == -1)
                printf("Error: Write()");           
        }
    }

    for(int j = 0; j < 2; j++)
    {
        wait(NULL);
        if(read(pd[0], &num, sizeof(int)) == -1)
            printf("Error: Read()");

        sum += num;
    }
    printf("Total: %d\n", sum);
}
c linux pipe fork
1个回答
1
投票

这里有很多问题。

  • 你必须... if(pipe(pd) == -1)我假设你的意思是要为它设置一个错误处理程序作为 "then "子句,但你没有,所以只有在管道失败时才会产生孩子,这基本上与你想要的相反。
  • 你有 scanf("%d", num);. 你需要 &num 自从 num 是不是已经是一个指针。
  • 你需要 returnexit 的子进程,否则它们就会陷入下一个循环并消耗输出。

只要把这些东西固定下来,就足以让它工作了。

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int pipe(int pd[2]);
int main(int argc, char *argv[])
{

    int pd[2], sum=0, num=0;
    if(pipe(pd) == -1)
    {
        perror("pipe");
        return 1;
    }
    for(int i = 0; i < 2; i++)
    {
        if(fork() == 0)
        {
            scanf("%d", &num);
            if(write(pd[1], &num, sizeof(int)) == -1)
                printf("Error: Write()");
            return 0;
        }
    }

    for(int j = 0; j < 2; j++)
    {
        wait(NULL);
        if(read(pd[0], &num, sizeof(int)) == -1)
            printf("Error: Read()");

        sum += num;
    }
    printf("Total: %d\n", sum);
}

还有一些其他的东西你也应该修正, 但它们并不是完全的障碍。下面是我跳出来的东西。

  • 你不需要声明你自己的 pipe 原型。unistd.h中的那个就可以。
  • 你应该处理以下情况 forkscanf 失败。
  • 你应该处理部分读和写。
  • 你应该在分叉后关闭子系统中管道的读端和父系统中管道的写端。
  • 你应该考虑使用锁来控制读取输入,这样就不会依赖TTY线缓冲来可靠地工作。
© www.soinside.com 2019 - 2024. All rights reserved.