没有线程的竞态条件?

3

假设我有一个名为sample.c的文件:

int main (...) {

  char str*;

  get s through user input

  test(str);

  return 0;

}

void test (str) {

   copy str to new file 

   change file permissions on new file

   close file

}

这里不存在竞态条件,因为在我的main()方法中没有线程。这是真的吗?
5个回答

8

存在一种竞态条件,即在您更改“新文件”的权限之前,用户可以立即交换“新文件”。这是(曾经是)一个常用的安全漏洞。

我刚看到Neil Butterworth有一个相关的想法。


实际的竞争条件是用户可以在“新文件”中更改数据(“交换”文件取决于目录权限),并且可以在创建“新文件”之前使用umask()关闭。 - ninjalj

6

有可能会发生竞态条件 - 两个用户可能同时运行您的程序。


@Neil- 在这种情况下有什么解决方案? - Praveen S
@Praveen 这取决于文件系统。有些操作通常是原子性的,并可用于锁定逻辑。 - anon
你能否将void test(str)的前两个步骤合并以消除竞争条件?或者由于两个用户可能调用相同的程序,仍然可能存在竞争条件吗? - Kevin Meredith
@Praveen:消除那种竞争是使用open(2)函数的O_EXCL标志的目的。 - caf

1

竞争条件的另一个源头是中断和信号。如果您两者都不使用,则不会发生竞争条件(只有一个赛车手)


1
尽管你的答案在技术上是正确的,但每个具有抢占式调度的操作系统都使用中断来给每个进程分配时间片。该程序中没有显式的中断代码并不意味着不会发生中断。 - Thomas

0

每次进行系统调用时都存在竞态条件的可能性。这是因为内核将系统上的所有线程链接在一起,并允许进程之间的控制交互。在这种情况下,系统上的另一个线程可以访问与您的应用程序相同的文件。


0

boost::filesystem文档提供了关于文件系统竞争条件的良好解释,这对于一般的文件系统都适用。


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