考虑以下任务:
1)读取目标目录内容,将每个找到的目录结构传递给某个过滤器函数,并以某种方式记住过滤后的元素以供以后处理
2)一段时间后,遍历过滤的元素并处理它们(做一些I/O)
最明显的方法是保存子目录的名称。
但是,我希望将内存使用量保持在最低限度并避免额外的 I/O。
根据 POSIX 手册,我可以使用 telldir() 保存每个目录条目的位置,然后使用 seekdir() 恢复它们。为了保持这些位置有效,我必须保持目标目录打开并且不使用 rewinddir() 调用。
保持目录流打开并存储目录位置列表(long int`s)似乎是一个合适的解决方案。
但是,尚不清楚文件夹修改后存储的位置是否仍然有效。我在 POSIX 标准中没有发现对这些条件的任何评论。
很容易测试并找出特定系统的这些问题的答案,但我想知道关于这个主题的标准是什么
谢谢
在Linux中,是否可以使用非内核API通过描述符获取指定文件的引用计数值(使用文件的计数器值)?
我想了解插座的API(的使用recv,send,select,close在并行线程,等等)。这意味着在两个并行线程上使用一个套接字文件描述符。我已经通过了这个问题。但是我仍然找不到任何标准文档来解释多线程中套接字 API 的用法。即使是opengroup手册页也没有说明这方面的任何内容。
我还想知道下面列出的并行线程使用场景在 POSIX 套接字 API 中是否有效
1)在两个并行线程中调用recv和send
int main_thread() {
    fd = do_connect(); //TCP or UDP
    spawn_thread(recv_thread, fd);
    spwan_thread(send_thread, fd);
    ...
}
int recv_thread(fd) {
    while(1) {
        recv(fd, ..)
        ...
    }
}
int send_thread(fd) {
    while(1) {
        send(fd, ..)
        ...
    }
}
2)在两个并行线程中调用recv和send使用select
int recv_thread(fd) {
    while(1) {
        select(fd in readfd)
        recv(fd, ..)
        ...
    }
}
int send_thread(fd) …Gcc并printf说这timer_t是指针(在我身上linux).但是这个指针放置了什么,并且是NULL一个有效的计时器ID?
此外,它是特定于平台的东西,例如它是指针on linux,int on macOs,sth.别的BSD.
我正在尝试使用MinGW 编译libUnihan代码,但是遇到了需要移植的函数.该函数的目的是获得规范路径表示.它使用pwd.h(这是POSIX,而MinGW不是)因此它可以通过检索passwd包含的结构来解释使用'〜'来表示主目录pw_dir.我发现一些信息在这里,和一个端口realpath 在这里,但我仍然完全处于亏损至于如何处理这个.使用MinGW,我仍然有一个主页目录,~并且位于/home/nate,但由于它不是POSIX,我不必pwd.h帮我找到这个主目录的位置.
问:如何将下面的功能移植到MinGW上?
/**
 * Return the canonicalized absolute pathname.
 *
 * It works exactly the same with realpath(3), except this function can handle the path with ~,
 * where realpath cannot.
 *
 * @param path The path to be resolved.
 * @param resolved_path Buffer for holding the resolved_path.
 * @return resolved path, NULL is the resolution is not sucessful. …我知道errno是线程安全的。在Linux中,还有另外两个类似的功能,即strerror和strerror_r。根据Linux System ProgrammingRobert Lover 的书,strerror不是线程安全的,而strerror_r是线程安全的。所以我想知道perror是否是线程安全的。
基于@Kametrixom 答案,我已经做了一些测试应用程序来并行计算数组中的总和。
我的测试应用程序如下所示:
import UIKit
import Metal
class ViewController: UIViewController {
// Data type, has to be the same as in the shader
typealias DataType = CInt
override func viewDidLoad() {
    super.viewDidLoad()
    let data = (0..<10000000).map{ _ in DataType(200) } // Our data, randomly generated
    var start, end : UInt64
    var result:DataType = 0
    start = mach_absolute_time()
    data.withUnsafeBufferPointer { buffer in
        for elem in buffer {
            result += elem
        }
    }
    end = mach_absolute_time()
    print("CPU result: \(result), time: \(Double(end …我希望能够安全地在不支持的系统上open进行模拟。我可以通过以下方式在某种程度上实现我的要求:O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOWO_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOWO_NOFOLLOW
struct stat lst;
if (lstat(filename, &lst) != -1 && S_ISLNK(lst.st_mode)) {
    errno = ELOOP;
    return -1;
}
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, mode);
但随后我引入了竞争条件和可能的安全问题。
我想过也许创建一个虚拟文件,只有用户能够写入,有点像touching filename,进行lstat检查,然后chmod在完成写入后使用(以更正文件模式位),但我可能会忽略一些主要的东西(例如,如果文件filename存在,不是常规文件,或者已经是符号链接)。
你怎么认为?
在POSIX API中,read()返回0表示已到达文件结尾.为什么没有一个单独的函数告诉你read()将返回零 - 而不需要你实际调用read()?
询问的原因:由于你必须打电话read()才能发现它会失败,这使得文件读取算法更加复杂,效率可能略低,因为它们必须分配可能不需要的目标缓冲区.
我们可能想做什么......
while ( !eof )
   {
   allocate buffer
   read to buffer
   process buffer
   }
我们要做的是......
while ( true )
   {
   allocate buffer
   read to buffer
   if ( eof ) release buffer, break;
   process buffer
   }
此外,它似乎像这种行为本身传播到更高级别的API,如fread()和feof()用C -而且创造了很多关于如何使用混乱的feof()正确: