Синтаксис fopen() в Linux для общего ресурса samba

Я пытаюсь использовать следующий синтаксис для fopen() для доступа к общему ресурсу samba.

FILE *of = fopen("smb://sambadevice/folder/filename.txt", "w");

но это не работает (errno = 2).

Кто-нибудь знает правильный синтаксис для доли самбы?

PS - если я наберу "smb://sambadevice/folder" в Dolphin, он откроет папку.

fopen и базовый open работают только с файлами в смонтированных файловых системах. Они не понимают URL-адреса SMB. GNOME имеет GVfs для локального монтирования удаленных файловых систем, таких как общие ресурсы SMB, в качестве подкаталога ${XDG_RUNTIME_DIR}/gvfs. Эквивалентом KDE является КиоФьюз, но работа над ним еще не завершена.
Ian Abbott 08.07.2019 11:24

Спасибо @Ian Abbott за это понимание.

42LeapsOfFaith 08.07.2019 11:46

Раньше (я больше не использую KDE) я использовал Smb4K для подключения общих ресурсов SMB в KDE. Это все еще, кажется, поддерживается, так что стоит изучить.

Ian Abbott 08.07.2019 12:15

когда вызов fopen() терпит неудачу (возвращает NULL), то следует немедленно вызвать perror(), поэтому текст, по которому система считает, что произошла ошибка, выводится в stderr

user3629249 09.07.2019 00:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
456
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

fopen не понимает синтаксис Любые. Нет никаких специальных форм имени файла, которые вы можете передать, чтобы получить доступ к чему-то особенному, не что иное, как обычный путь имени файла в (что кажется) локальной файловой системе.

Когда вы передаете путь к fopen, обычно он никаким образом не анализирует и не проверяет строку пути; он просто передает его базовому системному вызову open. И затем open не делает ничего, кроме очень простого синтаксического анализа пути: все, что он делает, это разбивает его на / символов, чтобы он мог пройти путь (пройти через любые каталоги и подкаталоги), чтобы найти запрошенный файл . Это соответствует важному постулату философии Unix, а именно «все есть файл».

Однако это абсолютно означает, что нет означает, что нет никакого способа получить доступ к смонтированным Samba файловым ресурсам с помощью программы C, которая вызывает fopen. Если вы хотите получить доступ к файловым ресурсам, смонтированным на Samba, вам нужно выяснить, как их устанавливать в локальной файловой системе. Есть много способов сделать это. Я использую команду mount.cifs. Люди в комментариях также упоминали GVfs, KioFuse и Smb4K.

После того, как вы смонтировали общий файловый ресурс Samba (или, аналогичным образом, смонтировали ресурс Любые), как если бы это был файл или каталог в локальной файловой системе, вы можете получить доступ через его путь, как если бы -- ну, как если бы это был файл или каталог в локальной файловой системе. (И, конечно же, вы можете получить к нему доступ через любой инструмент или приложение, независимо от того, вызывает ли это программу на C fopen.)

Таким образом, в системе Unix или Linux вы обычно не увидите явного синтаксиса smb:// в открываемом пути. Обычно путь, который вы открываете, начинается с /mnt, /cifs или /home/myname/.gvfs, то есть где бы в файловой системе не был смонтирован общий ресурс Samba.

Как правило, в Linux для автоматического монтирования общих ресурсов smb в каталоге /cifs используется autofs, поэтому можно использовать путь типа «/cifs/sambadevice/folder/filename.txt». В большинстве дистрибутивов Linux поддержка autofs/smb отключена по умолчанию, поскольку это имеет некоторые последствия для безопасности (если вы не доверяете другим устройствам в локальной сети, это несколько небезопасно).

Chris Dodd 09.07.2019 17:18

Другие вопросы по теме