2010-08-09 3 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 

} 

Там нет возможности условия гонки здесь, поскольку у меня нет никаких потоков в моем основном методе(). Это правда?

ответ

8

Существует какое-то условие гонки, в котором пользователь может обмениваться «новым файлом» непосредственно перед изменением разрешений «нового файла». Это (был?) Часто используемый эксплойт безопасности.

Я просто вижу, что у Нейла Баттерворта была связанная идея.

+0

Спасибо, Питер Г и Нил Баттерворт. –

+0

Фактическое состояние гонки состоит в том, что пользователь может _change_ данные в «новом файле» («обмен» файла зависит от разрешений каталога) и может быть закрыт с помощью 'umask()' перед созданием «нового файла». – ninjalj

1

Другими источниками условий гонки являются прерывания и сигналы. Если вы не используете ни то, ни другое состояние гонки не произойдет (есть один гонщик)

+1

Хотя ваш ответ технически корректен, каждая ОС с предварительным планированием использует прерывания, чтобы каждый процесс обрабатывал свой временной срез. Отсутствие явного кода прерывания в этой программе не означает, что прерываний не произойдет. – Thomas

6

Существует возможность гонки - два пользователя могут одновременно запускать вашу программу.

+0

@ Neil- Какое решение в этом сценарии? –

+0

@Praveen Зависит от файловой системы. Некоторые операции обычно являются атомарными и могут использоваться для блокировки логики. – 2010-08-09 16:34:52

+0

Не могли бы вы объединить первые два этапа теста void (str), чтобы устранить состояние гонки? Или может быть еще условие гонки, так как два пользователя могут вызвать одну и ту же программу? –

0

В любое время, когда вы делаете системный вызов, существует возможность гонки. Это связано с тем, что ядро ​​связывает все потоки в системе и позволяет контролировать взаимодействие между процессами. В этом случае другой поток в системе может обращаться к тому же файлу, что и ваше приложение.

0

boost::filesystem docs имеют хорошие объяснения условий гонки файловой системы, которые применимы к файловым системам в целом.

Смежные вопросы