c
  • linux
  • operating-system
  • terminal
  • 2011-03-05 71 views 0 likes 
    0

    大家好我在僞終端/dev/pts/1上運行以下代碼,我試着從終端/dev/pts/2讀取內容。無法使用read()系統調用從其他終端讀取數據

    #include<stdio.h> 
    #include<unistd.h> 
    #include<fcntl.h> 
    
    int main(){ 
    
    char str[50]; 
    
    int fd = open("/dev/pts/2",O_RDONLY); 
    str[read(fd,str,20)] = '\0'; 
    
    printf("%s\n",str); 
    
    
    return 0; 
    

    }

    [email protected]:~$ gcc test.c 
    [email protected]:~$ ./a.out 
    n 
    [email protected]:~$ 
    

    在終端/dev/pts/2我輸入了 「anirudh」 但它表明 「airudh」 對與缺少的字符n被顯示在終端上/dev/pts/1。 但是,當我嘗試從終端/dev/pts/1讀取時,我可以正確讀取每個字符。 所以我無法理解這個程序的行爲。請幫助我。提前致謝。 :)

    回答

    1

    首先,你可能有另一個進程從/ dev讀/ PTS/2,因此字符發送到它,而不是你的。然後終端可能被設置爲讀取其他進程的「char per char」模式(這就是某個shell所做的),你只讀一個字符。

    +0

    只是想澄清。如果沒有你在pts1中運行的程序運行類型'w',你會看到從pts2讀取的進程(它可能是/ bin/bash),然後在pts2中運行你的程序並在pts1中再次鍵入'w',你會看到進程讀取將是你的程序 - 在這種情況下,一切正常。 – zkunov 2011-03-05 10:43:37

    0

    哇。首先,這是一個很好的規則:檢查系統調用返回給你。 Alaways。

    int main(){ 
    
        char str[50]; 
    
        int fd = open("/dev/pts/2",O_RDONLY); 
        if (fd == -1) { 
         perror("open"); 
         ... 
        } 
    

    其次,閱讀可能會返回更少的字節比你要求,看的人:

    它不是如果這個數字小於請求的字節數小的錯誤;這可能發生在 示例中,因爲現在實際上可用的字節數更少(可能因爲我們接近文件結尾,或者因爲我們正在從管道或終端讀取 ),或者因爲read()被中斷由一個信號。

    因此即使是1字節也可能從讀取返回。第三,讀取可能返回-1:

    出錯時,返回-1,並且適當地設置errno。

    所以我想這是最好寫:

    ssize_t nread; 
        if ((nread = read(fd, str, 20) > 0)) { 
         str[nread] = '\0'; 
        } else if (nread == -1) { 
         perror("read"); 
         ... 
        } 
    
        printf("%s\n",str); 
        return 0; 
    } 
    
    相關問題