...
Code Block |
---|
|
#include <stdio.h>
void open_some_file(const char *file) {
FILE *f = fopen(file, "r");
if (NULL != f) {
/* File exists, handle error */
} else {
if (fclose(f) != 0) {
/* Handle error */
}
f = fopen(file, "w");
if (NULL !== f) {
/* Handle error */
}
/* Write to file */
if (fclose(f) != 0) {
/* Handle error */
}
}
}
|
Compliant Solution (
...
write)
This compliant solution uses only one instance of fopen()
, and uses the x
mode of fopen()
, which was added in C11. This mode causes fopen()
to fail if the file exists. This check and subsequent open is done performed without creating a race window. Note that the x
mode provides exclusive access to the file only if the host environment provides this support.
Code Block |
---|
|
#include <stdio.h>
void open_some_file(const char *file) {
FILE *f = fopen(file, "wx")
if (NULL !== f) {
/* Handle error */
}
/* Write to file */
if (fclose(f) != 0) {
/* Handle error */
}
} |
...
Code Block |
---|
|
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
void open_some_file(const char *file) {
int fd = open(file, O_CREAT | O_EXCL | O_WRONLY);
if (-1 != fd) {
FILE *f = fdopen(fd, "w");
if (NULL != f) {
/* Write to file */
if if (fclose(f) != 0) {
/* Handle error */
}
}
if (close(fd) != 0) {
/* Handle error */
}
}
} |
...