Articles of 生锈

在运行iter :: count时收到“非法指令”

运行这个: fn main() { std::iter::count(1i16, 3).collect::<Vec<i16>>(); } 我得到: 线程“'容量溢出恐慌',/ home / tshepang / projects / rust / src / libcore /选项:329 这是我所期望的,当运行这个: fn main() { std::iter::count(1i8, 3).collect::<Vec<i8>>(); } 但是,我得到这个: 非法指示 另外,syslog显示这一行: 12月27日08:31:08 thome内核:[170925.955841]陷阱:主[30631]陷阱无效操作码ip:7f60ab175470 sp:7fffbb116578错误:0在主[7f60ab15c000 + 5b000]

Valgrind显示没有分配

我正在学习Rust,我在玩Box ,所以我试着用valgrind检查泄漏,但是它显示堆上没有分配: $ rustc -C opt-level=0 raii.rs $ valgrind ./raii ==3850== Memcheck, a memory error detector ==3850== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==3850== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info ==3850== Command: ./raii ==3850== 5 Changed:10 ==3850== ==3850== HEAP SUMMARY: ==3850== in use at exit: 0 […]

我无法将颜色转义码打印到terminal

当我运行这个脚本时: fn main() { // \033[0;31m <- Red // \033[0m <- No Color println!("\033[0;31mSO\033[0m") } 我期望得到 SO #in red letters 但是,我得到: 33[0;31mSO33[0m 当我在Go或Python中运行类似的脚本时,我得到了预期的输出结果。 到底是怎么回事? 我错过了什么? 如何解决这个问题? 我在用: $ rustc –version rustc 1.3.0 (9a92aaf19 2015-09-15) $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Codename: trusty

MIO EventLoop不运行TcpStream

我是一个生锈的初学者与asynchronousIO的问题挣扎。 我决定使用mio 。 我已经阅读了一些源代码+教程,但仍然有一些基本的部分,我不明白。 我正在使用netcat -k -l 127.0.0.1 9999设置服务器。 然后我正在用cargo简单testing(代码如下)。 我期待着看到“准备好”或“打勾”的恐慌。 但是它永远不会发生,testing正在运行。 extern crate mio; use mio::*; #[allow(unused_imports)] use mio::tcp::TcpStream; #[allow(dead_code)] struct MyHandler; impl Handler for MyHandler { type Timeout = (); type Message = (); fn ready(&mut self, _event_loop: &mut EventLoop<Self>, _token: Token, _event_set: EventSet) { panic!("ready"); } fn tick(&mut self, _event_loop: &mut EventLoop<Self>) […]

创build一个窗口时在ntdll.dll中的SIGSEGV

我正在尝试创build一个简单的GUI应用程序,在Windows 7 x64上显示一个窗口。 我正在使用FFI为了从防火墙调用Windows API,但我不断得到ntdll.dll内的SIGSEGV。 难道我做错了什么? 整个代码可以在https://github.com/rillomas/rust_samplefind,但是我会在这里发布主要的东西。 winapi.h和winapi.c是Windows API的C封装器。 他们被编译成静态库(libwinapi) winapi.rs是一个链接到libwinapi FFI的箱子。 main.rs链接到winapi并显示一个窗口。 rustc -v的信息如下: C:\Program Files (x86)\Rust\bin\rustc.exe 0.11-pre-nightly (7d725a3 2014-04-21 23:01:39 -0700) host: i686-pc-mingw32 winapi.h #ifndef WINAPI_H_ #define WINAPI_H_ #define UNICODE #include <windows.h> #include <stdbool.h> #define API_CALL_CONVENTION __stdcall #ifdef __cplusplus extern "C" { #endif typedef struct { int width; int height; HWND handle; } […]

如何在离线环境中使用Cargo来build立项目?

我有一台带有可以访问互联网的OS X系统的笔记本电脑,以及一些因安全原因而无法访问互联网的Linux服务器。 我想在Linux服务器上build立一个依赖于Rust的Rust项目。 由于Linux服务器无法访问互联网,我在OSX笔记本电脑上运行cargo build命令,并将依赖源文件下载到.cargo目录,然后将这些文件复制到Linux服务器,并将它们放到/root/.cargo目录中。 我使文件结构相同,但是当我在Linux服务器上运行cargo build时,它仍然试图连接到这个网站,并且构build失败。 虽然dep源文件已经在.cargo目录中,但cargo build命令总是试图连接互联网。 如何在脱机环境中构build依赖关系的Rust项目? 为什么复制依赖项的源文件不起作用?

使用Linux调用dumbbuffer上的mmap在Rust中直接渲染pipe理器在C中工作时失败

一段时间以来,我一直在玩Linux的Direct Rendering Manager ,它允许你做一些非常低级别的graphicspipe理。 这通常在C中完成,在libdrm的帮助下,或者直接使用DRM头文件 。 我试图在Rust中创build一个等价于libdrm的函数,这不仅仅是一个绑定到C库,而是直接使用系统调用。 这不是一件容易的事情,因为几乎没有DRM的文档,但是我在C中按照这个例子来获取从哪里开始的提示。 我现在已经到了应该创build一个哑缓冲区并将其映射到内存中的地步,所以我可以修改屏幕上每个像素的像素。 为此,我必须使用mmap ,但是我得到一个非常奇怪的错误。 这是C:中最小的工作代码: #include <errno.h> #include <fcntl.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include <drm/drm.h> #include <drm/drm_mode.h> #include <sys/ioctl.h> #include <sys/mman.h> int main() { // STEP 1: GET ACCESS TO DRM int fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); if (fd < 0) { printf("Error in function […]

在OSX上的应用程序不能产生超过2048个线程

我在OSX上有一个Rust应用程序,可以在下面的代码中看到大量的线程,但是,在通过sysctl kern.num_taskthreads命令查看我的OSX版本允许创build多less个最大线程后,我可以看到,它是kern.num_taskthreads: 2048这解释了为什么我不能旋转超过2048线程。 我怎样才能克服这个难题? let threads = 300000; let requests = 1; for _x in 0..threads { println!("{}", _x); let request_clone = request.clone(); let handle = thread::spawn(move || { for _y in 0..requests { request_clone.lock().unwrap().push((request::Request::new(request::Request::create_request()))); } }); child_threads.push(handle); }

我能否以非规范的方式从标准input读取数据?

有什么办法可以在Linux下以非规范模式从标准input读取? 非规范input意味着对stdin的 read()调用在用户input后立即返回,这不是默认的行为,正如试图看到的那样: // Create a buffer let mut buffer :[u8; 1] = [0]; // Loops over the input from stdin, one character a time while io::stdin().read(&mut buffer).unwrap() > 0 { println!("{:?}", buffer); } 这段代码等待用户按回车键打印buffer的内容。 期望的行为将是打印为用户input。 在Stdin (上面代码中的stdin()调用返回的结构)文档中,没有提及如何改变这种默认行为。

如何使用nix的ioctl?

我想从Rust中调用ioctl 。 我知道我应该使用nix箱子 ,但究竟是如何? 从文档中不清楚。 我有这个C: int tun_open(char *devname) { struct ifreq ifr; int fd, err; if ( (fd = open("/dev/net/tun", O_RDWR)) == -1 ) { perror("open /dev/net/tun");exit(1); } memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TUN; strncpy(ifr.ifr_name, devname, IFNAMSIZ); /* ioctl will use if_name as the name of TUN * interface to open: "tun0", etc. */ […]