C++中的程序如何使用"系统"变量与 Linux 中的 shell 脚本交互?

How a program in C++ can interface with shell scripts in Linux by using 'system' variables?

本文关键字:中的 Linux shell 脚本 交互 系统 程序 C++ 何使用 变量      更新时间:2023-10-16

我有一个在Linux上运行的shell脚本,它基本上每隔30秒用网络摄像头拍摄一张照片,并将结果存储在目录中,通过覆盖旧图像来替换它。

然后,用C++编写的程序会读取这张照片,但一旦它与脚本异步执行,我想在该脚本中使用一个信号量,这样当我准备更新一张新照片时(比如5秒之前),脚本就会在这个标志中指示图片不可用于访问任何其他程序。

我想到的第一件事是,脚本只是将这些信息写在一个文本文件中,C++程序将其读回以了解状态,但我觉得这是一个粗略的解决方案。

我想的另一件事是,C++程序本身通过使用命令exec("./<script>.sh")以30秒的间隔实例化脚本,但由于该程序并不总是在运行,因此无法工作。

因此,我想知道如何使用某种"动态"系统变量(如果存在的话),一种充当RAM的东西,这样我就可以将其用作脚本指示某些状态的标志,然后程序读取它。

有可能吗?

基于以上提示,我得到了基于"命名管道"方法的解决方案。这背后的原因是,操作系统基本上将FIFO视为"文件",因此可以使用现有的相同标准系统库对其进行操作。只是共享用于测试的CPP代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/stat.h>
#define FIFO_FILE       "MYFIFO"
int main(void)
{
FILE *fp;
char readbuf[80];
int StrCnt = 0 ;
/* Create the FIFO if it does not exist */
umask(0);
mknod(FIFO_FILE, S_IFIFO|0666, 0);
while(1)
{
fp = fopen(FIFO_FILE, "r");
if ( fp > 0 )
{
fgets(readbuf, 80, fp);
printf("Received %dth string : %sn", StrCnt++ , readbuf);
fclose(fp);
// remove(FIFO_FILE);
rewind(fp);
}
}
return(0);
}

我可以用以下命令将值放入MYFIFO:

echo "abcde12345" > MYFIFO

ls-al命令显示FIFO内容,10个字符+1个空字符,如果代码未运行:

-rw-rw-r-- 1 esp8266 esp8266    11 10 22 16:10 MYFIFO

而如果代码正在运行,它会清空缓冲区(上面的函数reward()):

prw-rw-rw- 1 esp8266 esp8266     0 10 22 16:12 MYFIFO