chdir()和C语言中的多线程

4

在使用pthread.h时,是否可以使用chdir()或其他命令在线程中更改目录,而不影响其他线程的当前工作目录?

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


4
听起来有些可怕。你想要实现什么目标?或许通过更清楚地表达问题的根本原因,可以得到更多的帮助。 - Ferenc Deak
问题已更新。 - IrishDog
4个回答

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

+1 我也打算随意尝试 *at 调用。虽然不是明确的“不行”,但这为 OP 达成目标提供了一些机会,具体取决于他的计划。 - Duck

4
不是的,当前工作目录是进程级别的设置,而不是线程级别的设置。
最好的方法是使用完整路径显式地访问目录中的文件,而不是为了访问文件而更改到该目录。

你能提供任何参考资料吗(可能是POSIX)?上次我寻找这个问题时,除了模糊的实现定义之外,什么都没有找到。 - rodrigo
正如 janneb 所指出的,所谓的 *at() 调用也可以使用。无论它们是否足以让 OP 达到目标线是他必须确定的。即使使用两种方法,模拟 cwd 也有点棘手。 - Duck

1

回答更新后的问题:

对于每个客户端,您将需要一个客户端结构,其中包括(Id、Ip、您可能认为重要的其他内容)以及客户端当前正在可视化的目录(假设您正在执行此操作)。

因此,当客户端发出请求时,您已经知道该客户端所在的目录。


好的,但是如果客户尝试更改目录怎么办?我的意思是,我应该使用哪个命令来代替chdir()? - IrishDog
你希望客户端在目录中做什么? - Ferenc Deak
如果您想列出目录中的文件并发送回客户端,请使用客户端的目录:https://dev59.com/6G855IYBdhLWcg3wrGZY - Ferenc Deak

0
在某些平台上,答案是“是”。虽然POSIX标准将当前工作目录指定为“每个进程”而不是“每个线程”,但一些平台提供了作为非标准扩展的每个线程工作目录。据我所知,唯一具有此功能的平台是Linux和XNU(macOS/iOS等),尽管它们用于设置每个线程工作目录的API在根本上是不兼容的。如果这些是您需要支持的唯一平台,您可以使用它们的每个线程工作目录支持。
然而,这意味着您的软件(或其此方面)将是基本不可移植的-它永远不会在Windows、Cygwin、FreeBSD/OpenBSD/NetBSD、Solaris/Illumos、AIX等平台上运行,因为这些平台缺乏每个线程工作目录的概念。虽然其中一个或多个可能会在未来添加该支持,但不能保证任何一个平台都会发生这种情况,即使发生也可能需要数年时间。
关于Linux和Apple API的详细信息,请参见我的另一个问题的答案,因此我在此不再重复这些细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接