2017-12-08 6 views
1

Ich versuche, folgende Datei aus C-Code zu lesen.nicht in der Lage, io-Datei vom Benutzer zu lesen

Datei: /sys/bus/iio/devices/iio\:device0/in_voltage7_raw

aber Dateizeiger Ich erhalte -1.

Mit dem Befehl cat kann die Datei gelesen werden.

Aber ich versuche, das gleiche von meinem Code wie folgt lauten:

nos_int32 nos_adc_read_port (ADC_PORT_DB *p_port, nos_int32 *data) 
{ 

    char file_name[VALUE_MAX]; 
    int value; 
    char buffer[BUFFER_LENGTH]; 
    char intBuffer[INT_BUFFER_LENGTH]; 
    int fd; 

    sprintf(file_name, "/sys/bus/iio/devices/iio\\:device0/in_voltage7_raw"); 

    fd = open(file_name, O_RDONLY); 

    if (fd == -1) { 
     return(-1); 
    } 
    if (read(fd, buffer, BUFFER_LENGTH) == -1) { 
     return(-1); 
    } 
    close(fd); 
    memcpy(intBuffer, buffer, BUFFER_LENGTH); 
    intBuffer[INT_BUFFER_LENGTH-1] = '\0'; 
    value = atoi(intBuffer); 
    *data = value; 
    return(0); 
} 

Nach der Zeile: fd = open(file_name, O_RDONLY);

Wert von fd -1. Wie kann es gelöst werden?

+1

Versuchen Sie, Ihre User-Space-Code mit 'sudo' läuft. – Gaurav

+2

Ist der Backslash wirklich im Dateinamen oder stammt er von der Shell, die den Doppelpunkt verlässt? –

+0

kann es/sys/class/gpio/gpio70 mit demselben Code lesen. –

Antwort

2

Die meisten Befehlszeilen-Shells verwenden einige Zeichen für spezielle Aktionen. Wenn Sie versuchen, sie als ihr tatsächliches Zeichen zu verwenden, müssen Sie ihnen einen Backslash voranstellen, um sie zu umgehen. In diesem Fall benötigt Ihre Shell den Doppelpunkt, wenn Sie auf diesen Dateinamen zugreifen.

In C Sie haben dieses Problem nicht, so dass Sie in Ihrem Code den Dateinamen, wie es ist wirklich setzen kann, wie zum Beispiel:

"/sys/bus/iio/devices/iio:device0/in_voltage7_raw"

+0

Backslash ist enthalten, um den Backslash im Dateinamen zu umgehen. Der tatsächliche Dateiname lautet:/sys/bus/iio/devices/iio \: device0/in_voltage7_raw –

Verwandte Themen