gpt4 book ai didi

c - 写入 dev/sys 文件是否会产生子进程?

转载 作者:行者123 更新时间:2023-11-30 15:00:40 24 4
gpt4 key购买 nike

我有一些带有 sysfs 驱动程序的设备。在执行其他操作之前,我需要通过将文件“configs.txt”的内容写入子系统 sysfs 目录中的文件来配置设备。这可以通过

成功完成
cat /home/configuration/configs.txt > /sys/bus/iio/devices/device3/config

如果在终端中输入此命令,大约需要 5 秒才能打印下一个 shell 提示符。我认为这意味着 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”并退出。我希望它等到配置完成,并且相对于从交互式 shell 执行相同命令的快速程序终止似乎表明它没有这样做。

我猜测 popen()cat 命令的完成视为进程的结束,从而结束 popen() 并继续。它不会将 sysfs 驱动程序正在执行的任何操作视为此操作的一部分,并且不会等待它。

我的想法是,也许它正在分拆第二个子进程来执行此操作,但是我不知道如何验证这一点,或者如何让我的程序等待第二个子进程完成后再继续。

我如何监控并等待该程序结束?

最佳答案

使用pclose()

popen()打开的管道应该用pclose()关闭。它还会阻止执行,直到子进程完成:

The pclose() function waits for the associated process to terminate and returns the exit status of the command as returned by wait4(2).

但它毫无用处,因为任何东西都不会通过该管道返回。所以最好

使用system()

它启动您的进程并等待它完成,所有这些都在一个函数调用中完成。问题是,当出现错误时,您的程序无法判断出了什么问题。您会得到退出状态,但它并不能说明是否例如。源文件或目标文件丢失。

最好的办法是

全部自己做

您可以自行打开config.txt以及sysfs中的文件,并将内容复制过来。之后一定要关闭它们,并检查每一步的返回值,这样当它不起作用时你就能准确地知道出了什么问题。

关于c - 写入 dev/sys 文件是否会产生子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41960746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com