Читаем Rust на примерах полностью

Если вы хотите дождаться завершения process::Child, вы должны вызвать Child::wait, который вернёт process::ExitStatus.

use std::process::Command;

fn main() {

let mut child = Command::new("sleep").arg("5").spawn().unwrap();

let _result = child.wait().unwrap();

println!("достигнут конец функции main");

}

$ rustc wait.rs && ./wait

# `wait` продолжает работать в течение 5 секунд, пока команда `sleep 5` не завершится

достигнут конец функции main

<p id="Работа_с_файловой_системой"><strong><a l:href="#Работа_с_файловой_системой">Работа с файловой системой</a></strong></p>

Модуль std::fs содержит различные функции для работы с файловой системой.

use std::fs;

use std::fs::{File, OpenOptions};

use std::io;

use std::io::prelude::*;

use std::os::unix;

use std::path::Path;

// Упрощённая реализация `% cat path`

fn cat(path: &Path) -> io::Result {

let mut f = File::open(path)?;

let mut s = String::new();

match f.read_to_string(&mut s) {

Ok(_) => Ok(s),

Err(e) => Err(e),

}

}

// Упрощённая реализация `% echo s > path`

fn echo(s: &str, path: &Path) -> io::Result<()> {

let mut f = File::create(path)?;

f.write_all(s.as_bytes())

}

// Упрощённая реализация `% touch path` (игнорирует существующие файлы)

fn touch(path: &Path) -> io::Result<()> {

match OpenOptions::new().create(true).write(true).open(path) {

Ok(_) => Ok(()),

Err(e) => Err(e),

}

}

fn main() {

println!("`mkdir a`");

// Создаём директорию, получаем `io::Result<()>`

match fs::create_dir("a") {

Err(why) => println!("! {:?}", why.kind()),

Ok(_) => {},

}

println!("`echo hello > a/b.txt`");

// Предыдущий `match` может быть написан проще, с помощью метода`unwrap_or_else`

echo("hello", &Path::new("a/b.txt")).unwrap_or_else(|why| {

println!("! {:?}", why.kind());

});

println!("`mkdir -p a/c/d`");

// Рекурсивно создаём директории, получаем `io::Result<()>`

fs::create_dir_all("a/c/d").unwrap_or_else(|why| {

println!("! {:?}", why.kind());

});

println!("`touch a/c/e.txt`");

touch(&Path::new("a/c/e.txt")).unwrap_or_else(|why| {

println!("! {:?}", why.kind());

});

println!("`ln -s ../b.txt a/c/b.txt`");

// Создаём символическую ссылку, получаем `io::Result<()>`

if cfg!(target_family = "unix") {

unix::fs::symlink("../b.txt", "a/c/b.txt").unwrap_or_else(|why| {

println!("! {:?}", why.kind());

});

}

println!("`cat a/c/b.txt`");

match cat(&Path::new("a/c/b.txt")) {

Err(why) => println!("! {:?}", why.kind()),

Ok(s) => println!("> {}", s),

}

println!("`ls a`");

// Читаем содержимое директории, получаем `io::Result>`

match fs::read_dir("a") {

Err(why) => println!("! {:?}", why.kind()),

Ok(paths) => for path in paths {

println!("> {:?}", path.unwrap().path());

},

}

println!("`rm a/c/e.txt`");

// Удаляем файл, получаем `io::Result<()>`

fs::remove_file("a/c/e.txt").unwrap_or_else(|why| {

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители