Ваш вопрос может быть 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
У вас нет каких-либо условий там, чтобы проверить, если не смогли. Он всегда печатает ошибку и выходит. Вы хотите что-то вроде 'if (file_descriptor == -1) {..}' вокруг этой части проверки ошибок. –
Вы можете улучшить свой вопрос, отредактировав его, чтобы предоставить более подробную информацию. –
@BlueMoon: Я просто убрал свой нисходящий голос и закрыл голос. Проверка ошибок происходит после * команды 'open' - она должна быть успешной, насколько я могу судить, и поэтому файл ** должен все же создаваться **.(Но я согласен, что сразу после этого ничего не происходит.) – usr2564301