2016-03-15 6 views
-3

В настоящее время я работаю над проектом, который требует от меня вызова команды Linux во время кода C. Я нашел в других источниках, что могу сделать это с помощью команды system(), а затем сохранить значение для оболочки Linux в моей программе на C.Linux & C: System() Команда

Например, мне нужно будет изменить каталог для

root:/sys/bus/iio/devices/iio:device1> 

, а затем входной

cat in_voltage0_hardwaregain 

как команда. Это должен выводить дважды в C.

Так что мой пример кода будет:

#include <stdio.h> 
#include <stdlib.h> 

double main() { 
    char directory[] = "cd /sys/bus/iio/devices/iio:device1>"; 
    char command[] = "cat in_voltage0_hardwaregain"; 
    double output; 

    system(directory); 
    output = system(command); 

    return (0); 
} 

Я знаю, что это, вероятно, не самый лучший способ сделать это, так что любая информация очень ценится.

+0

Что ваш вопрос? –

+1

Вы не можете использовать дочерний процесс для изменения рабочего каталога, поэтому 'cd' - это не программа, а встроенная оболочка. Вам нужно вызвать 'chdir()' в вашем собственном процессе или использовать разумную вещь и использовать новые '* at()' версии файловых функций (например, 'openat()'). – EOF

+0

Это не работает. Почему бы не использовать функцию для чтения файла? Использование 'cat' кажется, будто вы стреляете головой через колено (возможно, вы обнаруживаете магическую пулю). – Olaf

ответ

3

Что вы действительно хотите сделать, так это открыть программу C и прочитать файл напрямую. Используя cd и cat через звонок system, просто встаньте в путь.

Вот простой способ сделать это:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int 
main(int argc,char **argv) 
{ 
    char *file = "/sys/bus/iio/devices/iio:device1/in_voltage0_hardwaregain"; 
    FILE *xfin; 
    char *cp; 
    char buf[1000]; 
    double output; 

    // open the file 
    xfin = fopen(file,"r"); 
    if (xfin == NULL) { 
     perror(file); 
     exit(1); 
    } 

    // this is a string 
    cp = fgets(buf,sizeof(buf),xfin); 
    if (cp == NULL) 
     exit(2); 

    // show it 
    fputs(buf,stdout); 

    fclose(xfin); 

    // get the value as a double 
    cp = strtok(buf," \t\n"); 
    output = strtod(cp,&cp); 
    printf("%g\n",output); 

    return 0; 
}