C++中的程序如何使用"系统"变量与 Linux 中的 shell 脚本交互?
How a program in C++ can interface with shell scripts in Linux by using 'system' variables?
我有一个在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
相关文章:
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 在不使用系统的情况下从C++应用程序格式化 Linux 中的 SD 卡
- createFile() 和 DeviceIoControl() 等效于 Unix/Linux 中的卷设备
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- Linux 服务器中的 Recv 缓冲区大小
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- Linux C++ 中的页面对齐内存分配
- 将 PHP-CPP 库链接到 Visual Studio 2017 中的 Linux 项目
- Bison-3.0.4 中的 Linux 从头开始错误 'make check'
- 递归执行C 中的Linux管道命令
- 使用C 中的Linux命令行进行分割故障
- 在C 中的Linux上指定共享库的路径
- 从 C++ 中的 Linux 应用程序发送电子邮件
- C 中的 Linux 无线 API C++.
- 相当于 Windows API 中的 Linux 上的 lseek
- 控制台应用程序中的Linux Qt QSystemTrayIcon
- 从C#中的Windows.NET程序到C++中的Linux程序之间的TCP
- c++中的Linux shmget()函数