簡體   English   中英

如何使用 C 和 linux 從用戶那里獲取鍵盤輸入?

[英]How do I get keyboard inputs from the user using C and linux?

我必須編寫一個簡短的程序,創建兩個子進程,每個子進程從鍵盤接受 integer 並將它們寫入 pipe,父進程從中匯總它們並在屏幕上顯示總數。

我用 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);
}

這里有很多問題:

  • 你有if(pipe(pd) == -1) ,我假設你打算有一個錯誤處理程序作為它的“then”子句,但你沒有,所以只有在 pipe 失敗時才會產生孩子,這基本上與您想要的相反。
  • 你有scanf("%d", num); . 您需要&num因為num還不是指針。
  • 您需要從子進程returnexit ,否則它們將進入下一個循環並消耗 output。

只需修復這些東西,就足以讓它工作:

#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失敗的情況。
  • 您應該處理部分讀取和寫入。
  • 您應該在分叉后關閉子代中 pipe 的讀取端和父代中 pipe 的寫入端。
  • 您應該考慮使用鎖來控制讀取輸入,以便它不依賴於 TTY 行緩沖來可靠地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM