如何在Ruby和其他语言之间共享文本文件(或互斥/信号量)
How to share text file (or a mutex/semaphore) between Ruby and another language?
我有一个C++程序,它正在将数据写入一个名为"history.txt"的文本文件。我希望它能连续写入,除非我的Ruby进程决定要从中读取。
这个问题的解决方案显然是互斥,但我只发现了用同一语言编写的进程之间共享互斥的例子。
我是否必须在两个进程之间使用命名管道来笨拙地实现这一点,或者有更简单的方法吗?
您应该能够通过在Ruby和C++中使用flock
锁定"history.txt"来实现您想要的目标(这可能也存在于许多其他语言中,因为它是一个系统调用),尽管在使用此方法时可能会出现一些问题。
这是我用来测试该方法的代码。
这是Ruby代码:
File.open("history.txt", "r+") do |file|
puts "before the lock"
file.flock(File::LOCK_EX)
puts "Locking until you press enter"
gets
puts file.gets
file.flock(File::LOCK_UN)
end
这是C++代码:
#include <iostream>
#include <fstream>
#include <sys/file.h>
int main()
{
FILE *h;
h = fopen("history.txt","a"); //open the file
std::cout << "Press enter to lockn";
std::cin.get();
int hNum = fileno(h); //get the file handle from the FILE*
int rt = flock(hNum, LOCK_EX); //Lock it down!
std::cout << "Writing!"<<rt<<"n";
fprintf(h,"Shoop da woop!n");
std::cout << "Press enter to unlockn";
std::cin.get();
rt = flock(hNum, LOCK_UN);
fflush(h);
fclose(h);
return 0;
}
通过运行这两种方法,您可以确认当C++进程锁定文件时Ruby进程停止,反之亦然。
相关文章:
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 如何获取与 objdump 输出的标签相对应的 ELF 二进制文件中的文件偏移量
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- C++:提升:托管共享内存是否需要信号量锁
- 信号量的问题
- 如何使用Windows API直接将进程"assign"到信号量?
- 如何在Ruby和其他语言之间共享文本文件(或互斥/信号量)