В размещенном вами коде filename
не инициализируется. Ваш компилятор должен был предупредить вас об этом. Если это не так, вы не вызываете его правильно; с gcc
, наберите не менее gcc -O -Wall
.
Вам также нужно выделить память для имени файла, если вы используете strcpy
. Этот шаг не обязателен в простой программе; создание копии становится полезным, если вам нужно запомнить имя файла после того, как вы продолжите чтение с клиента. Функция strdup
сочетает в себе выделение памяти с копированием строк, здесь уместно.
Вам необходимо проверить возвращаемое значение всех системных вызовов. Возвращаемое значение read
говорит вам, сколько байтов было прочитано. Вызов read(fd,buf,n)
может возвращать меньше n
байтов, если ОС чувствует себя так. Если вы получили меньше байтов, чем ожидали, вызовите read
в цикле. Да, почти все программы, которые вызывают read
, вызывают его в цикле, это базовая идиома Unix / POSIX. Функция fread
сделает это за вас, если вы можете в нее вписаться.
Код для проверки правильности msg.code
и msg.size
отсутствует. Поскольку вы выделили 256 байтов в msg.buffer
, вы должны ограничить msg.size
255.
Да, присваивание msg.buffer[msg.size] = '\0'
необходимо, потому что open
требуется символ '\0'
в конце имени (именно так он знает, где заканчивается имя).
Я подумал, что, возможно, strcpy подходит
Всякий раз, когда вы находитесь рядом с указателями (что чаще всего происходит в C), вам нужно тщательно продумать, что вы делаете и куда указывают эти указатели, и достаточно ли там места для того, что вы хотите поместить , С - неумолимый язык; метать стрелки так же опасно, как стрелять. Рисование диаграмм! Существует два вида программистов на С: те, которые рисуют диаграммы на доске, на бумаге, на песке или других носителях; и те, кто рисует диаграммы в своей голове (третий вид все еще пытается выяснить, почему их программа для печати 1+1
печатает 3
).