Состояние гонки без потоков?

Допустим, у меня есть: 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(). Это правда?


person Kevin Meredith    schedule 09.08.2010    source источник


Ответы (5)


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

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

person Peter G.    schedule 09.08.2010
comment
Фактическое условие гонки заключается в том, что пользователь может изменить данные в новом файле (обмен файлом зависит от разрешений каталога) и может быть закрыт с помощью umask() перед созданием нового файла. - person ninjalj; 24.02.2011

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

person Community    schedule 09.08.2010
comment
@Neil- Какое решение в этом сценарии? - person Praveen S; 09.08.2010
comment
@Praveen Зависит от файловой системы. Некоторые операции обычно являются атомарными и могут использоваться для блокировки логики. - person ; 09.08.2010
comment
Не могли бы вы объединить первые два шага теста пустоты (str), чтобы устранить состояние гонки? Или все еще может быть состояние гонки, поскольку два пользователя могут вызывать одну и ту же программу? - person Kevin Meredith; 09.08.2010
comment
@Praveen: Устранение этой расы - это то, для чего нужен флаг O_EXCL для open(2). - person caf; 10.08.2010

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

person Andrey    schedule 09.08.2010
comment
Хотя ваш ответ технически правильный, каждая ОС с упреждающим планированием использует прерывания, чтобы дать каждому процессу свой временной интервал. Отсутствие явного кода прерывания в этой программе не означает, что никаких прерываний не будет. - person Thomas; 09.08.2010

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

person doron    schedule 09.08.2010

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

person Dustin Getz    schedule 09.08.2010