2017-12-08 14 views
1

Cコードから次のファイルを読み込もうとしています。ユーザー空間からiioファイルを読み取ることができません

はファイル:私は取得しています/sys/bus/iio/devices/iio\:device0/in_voltage7_raw

が、ファイルポインタは-1です。

catコマンドを使用すると、ファイルを読み取ることができます。

しかし、私は次のように私のコードから同じことを読み込むしようとしています:

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

行後:FDの fd = open(file_name, O_RDONLY);

値は-1です。どのように解決することができますか?

+1

がsudo' 'を使用してユーザ空間のコードを実行してみてください。 – Gaurav

+2

そのバックスラッシュは実際にはファイル名にありますか、またはシェルからコロンをエスケープしていますか? –

+0

同じコードを使用して/ sys/class/gpio/gpio70を読み取ることができます。 –

答えて

2

ほとんどのコマンドラインシェルは特殊なアクションにいくつかの文字を使用します。実際の文字として使用する場合は、その文字をエスケープするためにバックスラッシュを付けなければなりません。この場合、シェルはファイル名にアクセスするときにコロンをエスケープする必要があります。

のような本当にです。これ、とあなたがあなたのコード内のファイル名を置くことができるので、あなたがこの問題を持っていないCで

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

+0

ファイル名にバックスラッシュをエスケープするためにバックスラッシュが含まれています。実際のファイル名は/ sys/bus/iio/devices/iio \:device0/in_voltage7_rawです。 –

関連する問題