2016-04-16 13 views
-1

Ich habe eine sehr einfache Quelle lesen Datei-Deskriptor, hängt. Konnte jemand das Problem erkennen, das der Code hat?lesen Datei-Deskriptor HANGS

Der erste ist die problematische Quelle und der zweite ist die Arbeitsquelle im Internet. Zwei Quellen sind fast identisch.

  • Erste Quelle

    #include <sys/types.h> 
    #include <sys/stat.h> 
    #include <unistd.h> 
    #include <fcntl.h> 
    #include <stdio.h> 
    
    int main(int argc, char ** argv) { 
        int n, in; 
        char buf[1024]; 
    
        if ((in = open(argv[1], O_RDONLY)<0)) { 
         perror(argv[1]); 
         return -1; 
        } 
    
        while((n = read(in, buf, sizeof(buf))) > 0) { //HANGS at THIS LINE!!!!!!!!!!! 
         printf("TEST\n"); 
        } 
    
        close(in); 
    
        return 0; 
    } 
    
  • Zweites Arbeits bekam Quelle von Online-

    /* 
    * ============================================================================ 
    * Name  : sp_linux_copy.c 
    * Author  : Marko Martinović 
    * Description : Copy input file into output file 
    * ============================================================================ 
    **/ 
    
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <fcntl.h> 
    #include <errno.h> 
    #include <sys/types.h> 
    #include <unistd.h> 
    
    #define BUF_SIZE 8192 
    
    int main(int argc, char* argv[]) { 
    
        int input_fd; /* Input and output file descriptors */ 
        ssize_t ret_in; /* Number of bytes returned by read() and write() */ 
        char buffer[BUF_SIZE];  /* Character buffer */ 
    
        /* Create input file descriptor */ 
        input_fd = open (argv [1], O_RDONLY); 
        if (input_fd == -1) { 
         perror ("open"); 
         return 2; 
        } 
    
        /* Copy process */ 
        while((ret_in = read (input_fd, &buffer, BUF_SIZE)) > 0){ 
         printf("TEST\n"); 
        } 
    
        /* Close file descriptors */ 
        close (input_fd); 
    } 
    
+1

Genau das, was tun Sie, um dies zu testen? –

+0

Ich implementierte Kopierdateien, die gelesen und geschrieben werden müssen. Um mein Problem zu klären und für Rezensenten einfacher zu sehen, entfernte ich den Schreibcode. – Sean83

Antwort

5

von einem lustigen Zufall, Sie lesen aus stdin. Dies ist, weil Sie in Ihrer if(in = ... einige Klammern verlegt haben.

Was passiert ist, dass zuerst open(argv[1], O_RDONLY)<0 ausgewertet wird, und das Ergebnis wird in in eingegeben. Da das Ergebnis von open() nicht kleiner als Null ist (bei erfolgreichem Öffnen), wird in zu 0. Und stdin ist der Name für den Dateideskriptor, der Null ist (auf den meisten Systemen). Es ist also ein gültiger Dateideskriptor, und lesen ist sehr glücklich, davon zu lesen. Es bekommt einfach nichts, bis Sie etwas in Ihre Konsole eingeben.

schnelle Lösung:

if ((in = open(argv[1], O_RDONLY)) < 0) { 
+2

Ein anderer 'clever code' Compound-Ausdruck geht schief :(Da das Aufteilen der Zeile den Fehler aufgedeckt/behoben hätte, werde ich Sie upbooten, um den Fehler zu finden und die OP-Frage zu verwerfen, noch ein deprimierender Fehler beim Debuggen :( –

+0

Ich bin nicht Das ist definitiv eine Lernerfahrung, und vielleicht hätte ich das in meiner Antwort erwähnen sollen: –

+0

Ah, ein dummer Fehler: Ich habe diesen Code fast zwei Stunden lang bearbeitet, bevor ich die Frage gestellt habe. Danke @David van Rijn – Sean83