2015-02-02 3 views
1

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

Мой код выглядит так:

char startroom[] = "laruee.rooms/startroom.txt"; 
//... 
int file_descriptor; 
//... 
file_descriptor = open(startroom, O_WRONLY | O_CREAT); 
{ 
    fprintf(stderr, "Could not open %s\n", startroom); 
    perror("in main"); 
    exit(1); 
} 

Однако, несмотря на все, что я гугле об этой команде, указывающей, что файл должен получить создан, если он уже не существует, файл не получает создан. (И также из всего, что я искал в googled, кажется, что я единственный программист во вселенной, столкнувшийся с этой проблемой.)

Что дает?

+5

У вас нет каких-либо условий там, чтобы проверить, если не смогли. Он всегда печатает ошибку и выходит. Вы хотите что-то вроде 'if (file_descriptor == -1) {..}' вокруг этой части проверки ошибок. –

+0

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

+0

@BlueMoon: Я просто убрал свой нисходящий голос и закрыл голос. Проверка ошибок происходит после * команды 'open' - она ​​должна быть успешной, насколько я могу судить, и поэтому файл ** должен все же создаваться **.(Но я согласен, что сразу после этого ничего не происходит.) – usr2564301

ответ

2

Ваш вопрос может быть operating-system (и даже file-system) особый. Я думаю, вы работаете на Linux на какой-то обычной файловой системе, например Ext4 или BTRFS.

Прочитано open(2) & path_resolution(7). Существует несколько причин, по которым может произойти сбой open (и мы не можем догадаться, что актуально для вашего компьютера).

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

Затем улучшить свой код, как:

char startroom[] = "laruee.rooms/startroom.txt"; 
//... 
int file_descriptor = open(startroom, O_WRONLY | O_CREAT); 
if (file_descriptor < 0) { 
    fprintf(stderr, "Could not open %s : %s\n", 
      startroom, strerror(errno)); 
    char wdbuf[256]; 
    if (getcwd(wdbuf, sizeof(wdbuf)) 
     fprintf(stderr, "in %s\n", wdbuf); 
    exit(EXIT_FAILURE); 
} 

При использовании perror или strerror на errno вы не хотите никакой функции, которая могла бы изменить errno для вызова после сбоя syscall. В Linux с glibc функция fprintf(3) знает о %m ....

Кстати, вы также можете strace(1) программа

Возможно также посмотреть в вашем /var/log/syslog или /var/log/messages. Убедитесь, что ваш диск не заполнен (используйте df -h и df -i). Если у вас есть disk quotas, обязательно не переполняйте их. Убедитесь, что ваша программа запущена в каталоге, в котором вы хотите, и этот текущий каталог содержит подкаталог laruee.rooms/; вы можете получить его с getcwd(2), как я сделал выше.

В частности, для серверных программ вы можете использовать syslog(3).

Вы должны прочитать Advanced Linux Programming

BTW свой контекстуальный open не команда (это будет xdg-open), но system call или по крайней мере POSIX function

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