使用ANSI C在ESP32中运行子流程的管道

使用ANSI C在ESP32中运行子流程的管道,c,subprocess,pipe,esp32,C,Subprocess,Pipe,Esp32,我正在进入使用,我想让一个程序能够在使用C时运行子进程 平庸地说,我尝试调用如下函数: ... #include <stdio.h> char *cmd = "ls -l"; char buf[BUFSIZE]; FILE *fp; if ((fp = popen(cmd, "r")) == NULL) { printf("############## Error opening pipe!\

我正在进入使用,我想让一个程序能够在使用C时运行子进程

平庸地说,我尝试调用如下函数:

...
  #include <stdio.h>

  char *cmd = "ls -l";    
  char buf[BUFSIZE];
  FILE *fp;
  if ((fp = popen(cmd, "r")) == NULL) {
      printf("############## Error opening pipe!\n");
      return -1;
  }
  while (fgets(buf, BUFSIZE, fp) != NULL) {
      printf("############## OUTPUT: %s", buf);
  }
  if(pclose(fp))  {
      printf("############## Command not found or exited with error status\n");
      return -1;
  }
  return 0;
...
有人有过这方面的经验吗?

popen()
是一种系统调用,可在兼容POSIX的系统和类似系统(UNIX、Linux、FreeBSD)上使用。ESP32运行的软件与POSIX不兼容

管道和子流程在ESP32上没有意义-它们不受支持。没有
popen()
调用

ESP32运行一个名为的轻量级操作系统。FreeRTOS提供了轻量级任务和非常简单的内存管理,其他功能不多

FreeRTOS任务共享一个地址空间;它们通常是非抢占式的,自愿让处理器允许其他任务运行,并执行一个子例程(C函数)。POSIX进程都有自己的地址空间,是抢占式的,运行POSIX二进制应用程序。它们完全不同,互不相容。ESP32没有适当支持POSIX进程的资源或内存管理硬件

(“物联网开发框架”)是构建在FreeRTOS之上的一层,它提供一个瘦API,提供对ESP32硬件(I2C、SPI、wifi、蓝牙、定时器等)的访问

和等其他编程环境都构建在ESP-IDF之上

ESP-IDF一次运行一个程序,与POSIX风格的系统不同。该程序是您编译、链接并存储在闪存中的程序。POSIX风格的系统一次运行数百或数千个程序。ESP32和ESP-IDF没有这样的能力

当您开始为ESP32构建应用程序时,不仅不能使用POSIX兼容的系统调用,还需要学习在资源非常有限的环境中编程。在Linux和类似的系统上,程序员通常编写代码,就好像在内存、文件系统大小和持久性方面没有限制一样。在ESP32上,这些都不是真的——编写一个偶然需要的内存超过其可用520KB的程序并不重要;编写一个需要比闪存中更多持久存储的程序是很简单的;编写一个程序,如此频繁地写入闪存,以致于破坏闪存,这是很平常的事。您需要学习如何在ESP32的约束下编程,而不仅仅是如何编写调用ESP-IDF而不是POSIX系统的代码


通读您链接到的ESP-IDF文档。这就是你工作的环境。您可能会发现在Arduino Core中开始更容易-它是一个C/C++环境,有大量的教程,而且它是一个更容易的构建环境,如果需要,您仍然可以从中轻松调用ESP-IDF函数。

您使用的工具链最有可能用于“裸机”,因此并没有实现所有的标准库。很好,详细的答案!只有一件事:在IDF上,调度仍然是先发制人的。至少这是我从为ESP32编写FreeRTOS端口的人那里得到的答案。
c:\esp\../main/app_main.c:139: undefined reference to `popen`