У меня есть серверная/клиентская программа, в которой сервер порождает дочерний элемент с fork() для каждого подключенного клиента. Затем клиент отправляет серверу команды для выполнения определенных запросов к базе данных sqlite3 (INSERT INTO, SELECT, DELETE FROM).
Примечание: я открываю базу данных после fork(), как указано здесь: https://www.sqlite.org/howtocorrupt.html в 2.6 сильный>
Проблема
Работает отлично, когда подключен 1 клиент, но когда подключено 2 клиента: когда один из них выполняет первый запрос, изменяющий базу данных (например: INSERT INTO), с этого момента только он может продолжать модификацию. Остальные получают ошибку: база данных заблокирована. Даже после того, как клиент, блокирующий .db, завершает работу, другой по-прежнему не может изменять.
Я пытался:
- PRAGMA journal_mode=wal в терминале sqlite3
- выполнение вручную BEGIN TRANSACTION; перед запросом INSERT и COMMIT; после
- sqlite3_close(db) после запроса INSERT и его повторного открытия после
Наблюдение:
Я знаю, что использование потоков, вероятно, было бы безопаснее и решило бы проблему, но я хотел бы попробовать все с помощью fork(), прежде чем менять всю структуру проекта.
Код сервера (я удалил ненужные части кода):
int main () {
sqlite3* db;
//code for connection...
while (1) {
client = accept(sd, (struct sockaddr *) &from, &length);
if (-1 == (pid = fork())) {
perror("Error at fork");
}
if (pid == 0) {
if (sqlite3_open("./Database.db", &db))
perror("Error: Could not open database.\n")
while (1) {
sprintf(query, "INSERT INTO table VALUES ('%s','%s','%s','%s','%s','%s');",string1, string2,string3,string4,string5,string6);
if(sqlite3_exec(db, query, NULL, 0, &error) != SQLITE_OK){
printf("%s", sqlite3_errmsg(db));
fflush(stdout);
}
}
}
Спасибо за ваше время!
perror
не подходит. Еслиsqlite_open3
возвращает что-то отличное отSQLITE_OK
, правильное сообщение об ошибке можно получить отsqlite3_errmsg
. Итак, какую ошибку вы на самом деле получаете? - person ikegami   schedule 08.01.2020exec
не работает? - person ikegami   schedule 08.01.2020sprintf()
и использованиемsqlite3_exec()
. Вот как вы получаете атаки SQL-инъекций, загадочные синтаксические ошибки и т. Д. - person Shawn   schedule 08.01.2020