相关疑难解决方法(0)

如何检查C++中的其他应用程序是否已打开文件?

我知道,is_open()C++ 中有这个功能,但是我想要一个程序检查一个文件是否还没有被其他应用程序打开.有没有办法使用标准库?

编辑 - 澄清答案,这是一个Linux应用程序.

c++ linux file-io process

10
推荐指数
2
解决办法
2万
查看次数

多个线程能够同时获得群集

我的印象是flock(2)是线程安全的,我最近在代码中遇到了这种情况,其中多个线程能够锁定同一个文件,这些文件都与使用获取独占锁使用同步c api flock.过程25554是具有20个线程的多线程应用程序,当发生死锁时,锁定到同一文件的线程数量变化.多线程应用程序testEvent是文件的编写者,其中push是文件中的reader.不幸的是,lsof它不会打印LWP值,所以我找不到哪个是持有锁的线程.当下面提到的情况发生时,进程和线程都停留在flock 调用上,如pid 25569和25554上的调用pstackstrace调用所示.有关如何在RHEL 4.x中解决此问题的任何建议.

我想要更新的一件事是flock不会一直行为不端,当消息的tx速率超过2 mbps时我才会遇到flock的死锁问题,低于tx速率一切都是文件.我保持num_threads= 20,size_of_msg= 1000字节不变,只是将每秒tx的消息数量从10条消息开始变为100条消息,即20*1000*100 = 2 mbps,当我将消息数量增加到150然后发送问题时发生.

我只是想问一下你对flockfile c api有什么看法.

 sudo lsof filename.txt
    COMMAND       PID     USER     FD       TYPE     DEVICE     SIZE   NODE       NAME
    push         25569    root     11u       REG      253.4      1079   49266853   filename.txt
    testEvent    25554    root     27uW      REG      253.4      1079   49266853   filename.txt
    testEvent    25554    root     28uW      REG      253.4      1079   49266853   filename.txt
    testEvent    25554    root     29uW      REG      253.4      1079   49266853   filename.txt
    testEvent    25554 …
Run Code Online (Sandbox Code Playgroud)

c linux glibc flock

10
推荐指数
1
解决办法
1万
查看次数

在fopen + mode中从多个线程/进程写入锁定文件之前是否需要同步/刷新?

我正在从多个线程对单个文件执行I/O. foo通过建议文件锁(flock(2)LOCK_EX)来控制对此共享文件的访问. foofopen(3)模式打开了a+. a+之所以被选中,是因为文件说明:

对文件的后续写入将始终以当前文件末尾结束,无论是否有任何干预fseek(3)或类似.

简化后,操作将开始:

FILE *fp = fopen("foo", "a+");
...spawn threads...
Run Code Online (Sandbox Code Playgroud)

写作将继续:

flock(fileno(fp), LOCK_EX);
fwrite(buffer, buffer_size, 1, fp);
flock(fileno(fp), LOCK_UN);
Run Code Online (Sandbox Code Playgroud)

我目前没有任何fflush(3)fsync(2)电话fwrite(3),我想知道我是否应该.fopen(3) a+在计算"当前EOF"时,模式是否会考虑多个线程命中文件?我知道,flock(2)当有出色的I/O时,给我锁定可能没有问题.

在我的有限测试中(写入非常长的ASCII文本行,然后在多个线程中使用换行多秒,然后确保生成的文件中每行的字符数相等),我没有看到任何"损坏"使用fflush(3)fsync(2).它们的存在大大降低了I/O性能.

tl; dr:使用文件锁时,是否需要在打开a+模式下写入多个线程之间的共享文件之前刷新流?多个叉子/不同的机器写入文件并行文件系统?

可能相关: 为什么在读/写"+"模式下读写之间总是需要fseek或fflush

c concurrency fopen locking file

1
推荐指数
1
解决办法
3468
查看次数

标签 统计

c ×2

linux ×2

c++ ×1

concurrency ×1

file ×1

file-io ×1

flock ×1

fopen ×1

glibc ×1

locking ×1

process ×1