У меня есть устройство, у которого есть драйвер sysfs. Прежде чем делать что-либо еще, мне нужно настроить устройство, записав содержимое файла «configs.txt» в файл в каталоге sysfs для подсистемы. Это может быть успешно сделано сЗаписывает ли файл dev/sys дочерний процесс?
cat /home/configuration/configs.txt > /sys/bus/iio/devices/device3/config
Если ввести эту команду в терминале, она занимает около 5 секунд для следующей строки для печати. Я полагаю, это означает, что независимо от того, что делает драйвер sysfs, требуется около 5 секунд.
Однако, если я пытаюсь использовать popen()
следующим образом:
int main(void){
FILE *file;
char terminal[512];
if(!(file=popen("cat /home/configuration/configs.txt > /sys/bus/iio/devices/device3/config", "r"))){return -1;}
while(fgets(terminal,sizeof(terminal),file)!=NULL){
printf("%s\n",terminal);
}
pclose(file);
printf("Done\n");
}
тогда программа сразу же печатает "Done" и завершает работу. Я бы хотел, чтобы он дождался завершения конфигурации, и быстрое завершение программы относительно выполнения одной и той же команды из интерактивной оболочки, похоже, указывает на то, что она этого не делает.
Я думаю, что popen()
считает завершение команды cat
как конец процесса и, таким образом, заканчивает popen()
и перемещается дальше. Он не считает, что драйвер sysfs делает как часть этого, и не ждет его.
Моя мысль заключалась в том, что, возможно, это отвлекает второй дочерний процесс, но я не знаю, как это проверить, или как заставить мою программу ждать завершения этого второго дочернего процесса, прежде чем продолжить.
Как я могу контролировать это и ждать завершения этой программы?
Я не понимаю. На этой странице https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm, похоже, указывается, что fgets возвращает NULL после достижения конца выполнения, и больше не нужно читать с терминала. –
Процесс 'cat', который вы охватываете, не собирается ничего писать в' stdout'. Приглашение, которое вы получаете после этой командной строки, находится из оболочки, а не из 'cat'. Поэтому не ожидайте выхода из него. –
Что было бы другим способом определить, когда обработка, выполняемая драйвером sysfs, завершена? –