chdir()& C中的多线程

bfnvny8b  于 2023-05-06  发布在  其他
关注(0)|答案(4)|浏览(149)

是否可以使用chdir()或其他命令来更改线程中的目录而不影响其他线程的cwd?我用的是pthread.h

  • 我正在尝试编写一个服务器程序,用于处理多个客户端连接和请求。客户端的一个可用命令是'cd'命令。
ubbxdtey

ubbxdtey1#

不,正如其他人提到的,当前工作目录是每个进程的属性,而不是每个线程的。您可以“模拟”每个线程(或每个客户端,或者您如何构建应用程序)的当前工作目录,方法是为“每个线程CWD”存储文件描述符,并使用POSIX 2008中指定的各种 *at()系统调用(openat()等)来操作相对于该目录fd的路径。

7eumitmz

7eumitmz2#

不,不是的。当前工作目录是进程范围的设置,而不是线程设置。
最好的办法是使用完整路径显式访问目录中的文件,而不是为此更改到该目录。

pwuypxnk

pwuypxnk3#

回答更新的问题:
对于每个客户端,您将需要一个客户端结构,其中包括其他内容(Id,Ip,任何您可能认为重要的内容),还包含客户端现在正在可视化的目录(假设您这样做)。
因此,当客户端发出请求时,您已经知道客户端在哪个目录中工作。

s6fujrry

s6fujrry4#

在一些平台上,答案是。虽然POSIX标准将当前工作目录指定为 per-process 而不是 per-thread,但一些平台提供了一个非标准扩展的per-thread工作目录。据我所知,唯一具有此功能的平台是Linux和XNU(macOS/iOS/etc),尽管它们用于设置每个线程工作目录的API从根本上相互不兼容。如果这些是您需要支持的唯一平台,那么您可以使用它们的每线程工作目录支持。
然而,这意味着你的软件(或它的这一方面)将是基本上不可移植的-它永远不会在Windows,Cygwin,FreeBSD/OpenBSD/NetBSD,Solaris/Illumos,AIX等平台上工作,因为这些平台缺乏每个线程工作目录的概念。这是 * 有可能 * 他们中的一个或多个可能会在未来添加这种支持,但没有保证会发生在他们中的任何一个,即使它这样做,它可能是几年后。
关于Linux和Apple API的细节,我在my answer to another question中解释了它,所以我不会在这里重复这些细节。

相关问题