Добрый день.
Может кто знает, могу я через общую память между процессами передать TcpStream
В настоящий момент получаю ошибку
error[E0277]: the trait bound `std::net::TcpStream: shared_memory::cast::SharedMemCast` is not satisfied
--> src/listener/mod.rs:50:43
|
50 | let mut shared_state = shared_mem.wlock::<TcpStream>( 1 )?;
| ^^^^^ the trait `shared_memory::cast::SharedMemCast` is not implemented for `std::net::TcpStream`
Как я понимаю нет реализации SharedMemCast для TcpStream. Может ее можно реализовать?
Если один процесс — подпроцесс другого, унаследовавший файловые дескрипторы родителя, то можно TcpStream
на одной стороне преобразовать в номер файлового дескриптора с помощью .into_raw_fd()
, а на другой восстановить с помощью ::from_raw_fd
. RawFd
— это просто c_int
, поэтому его спокойно можно передавать. Естественно, всё это unsafe
и валидно только для Unix-систем.
1 лайк
Да, я видел этот вариант. Спасибо!
В текущий момент есть желание передавать их между независимыми процессами.
Не могу только пока понять, вообще возможно в Linux такое?
Сделать это в лоб (расшарив TcpListener) точно нельзя.
Можно попробовать послать дескриптор через unix socket.
Я наверное просто не могу найти, как в Rust сделать так, что бы поток TcpStream не был удален после выполнения кода в одном процессе, а оставался в системе, что бы, после передачи его дескриптора в другой процесс, второй процесс мог отправить через него данные.
Подскажите, пожалуйста, где прочитать про это в документации можно?
Объект ядра удаляется в том момент, когда не один из процессов не держит на него дескриптор. Поэтому если дескриптор сокета был корректно передан в другой процесс, то все должно работать. Если вопрос в том, как именно передать дескриптор, то могу скинуть пару ссылок.
http://man7.org/linux/man-pages/man7/unix.7.html - в секции Ancillary messages
первый же пункт, SCM_RIGHTS
описывает как передавать дескрипторы.
https://docs.rs/nix - удобный интерфейс для многих системных интерфейсов, в том числе ancillary messages. (1, 2 и так далее).
https://docs.rs/tiny-nix-ipc - если оба процесса на расте, то это библиотека умеет перекидывать дескрипторы в одну строку.
Спасибо, большое. Буду читать!