2010-08-09 60 views
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()方法没有线程。真的吗?

回答

8

有一种竞争条件,用户可以在更改“新文件”的权限之前立即交换“新文件”。这是(被?)经常使用的安全漏洞。

我只看到尼尔巴特沃斯有一个相关的想法。

+0

谢谢Peter G和Neil Butterworth。 – 2010-08-09 16:34:00

+0

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

1

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

+1

虽然您的答案在技术上是正确的,但每个具有先占调度的操作系统都使用中断来为每个进程分配时间片。在这个程序中没有明确的中断代码并不意味着不会发生中断。 – Thomas 2010-08-09 16:20:57

6

有可能是比赛 - 两个用户可以同时运行您的程序。

+0

@ Neil-这种情况下的解决方案是什么? – 2010-08-09 16:31:27

+0

@Praveen取决于文件系统。有些操作通常是原子操作,可用于锁定逻辑。 – 2010-08-09 16:34:52

+0

您可以结合void test(str)的前两个步骤来消除竞争条件吗?或者,由于两个用户可以调用同一个程序,还是会出现竞争状态? – 2010-08-09 17:12:06

0

任何时候您进行系统调用都有可能出现竞争状况。这是因为内核链接了系统上的所有线程,并允许进程之间的控制交互。在这种情况下,系统上的另一个线程可以访问与您的应用程序相同的文件。