在开始用C编写的程序之前,我必须运行命令"ulimit -n 400"来提高允许打开文件的数量,但是有没有办法在C程序中执行相同的操作?
也就是说,增加该进程允许的打开文件描述符的数量.(我对每个线程限制不感兴趣.)
它是否涉及设置ulimits,然后分叉一个允许有更多打开文件的孩子?
当然,我可以编写一个运行ulimit的shell包装器,然后启动我的C程序,但感觉不那么优雅.我也可以通过bash或sh的源代码来查看它是如何在那里完成的 - 也许我会在这里得到答案.
还有关系,如果你想选择很多文件描述符,请看这里.
例如,strrev()函数.我知道它是在string.h中声明的,我想知道它是如何实现的.那我的源代码在哪里?
操作系统:Windows XP SP3
IDE:Pelles C 6.50 RC3
两个线程同时调用open()可以吗?如何找到这个问题的答案?
假定调用不同的文件上进行操作,他们的标志可以O_RDONLY,O_WRONLY或者两者兼而有之.
我在使用C标准库格式化函数(如sprintf())处理包含非ASCII字符的UTF-8字符串时发现了一个有趣的问题:
printf()系列的功能不知道utf-8并根据字节数而不是字符处理所有内容.因此格式不正确.
简单的例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char* testMsg = "Tääääßt";
char buf[1024];
int len;
sprintf(buf, "|%7.7s|", testMsg);
len = strlen(buf);
printf("Result=\"%s\", len=%d", buf, len);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Result="|Täää|", len=7
Run Code Online (Sandbox Code Playgroud)
很可能你们中的一些人会建议将应用程序从char转换为wchar_t并使用fwprintf()等,但由于现有的巨大应用程序,这绝对是不可能的.我可以想象编写一个在内部使用这些函数的包装器,但这会非常棘手并且非常低效.
因此,最好的解决方案是替换标准C库的格式化功能的UTF-8.
目前我正在研究QNX 6.4,但回复其他操作系统.例如Linux,也非常受欢迎.
我发现AVR uCs的C++编译器不支持new和delete运算符,但也有一个快速修复:
void * operator new(size_t size)
{
return malloc(size);
}
void operator delete(void * ptr)
{
free(ptr);
}
Run Code Online (Sandbox Code Playgroud)
我假设现在可以打电话了new ClassName(args);.
但是,我不确定这是如何工作的.例如,实际上在size_t这里返回什么?我认为构造函数不返回任何东西......
难道new现在应该以不同的方式使用(与之结合使用sizeof())?
我正在尝试找到unistd.h头文件中声明的Unix函数的Linux 3.2.21 x86_64实现.看看Linux unistd.h产生这个原型:sync(2)
/* Make all changes done to all files actually appear on disk. */
extern void sync (void) __THROW;
Run Code Online (Sandbox Code Playgroud)
所以我认为这sync是在Linux内核之外定义并查看glibc 2.7内部的内容,它在glibc-2.17/misc/sync.c中给我这个定义:
/* Make all changes done to all files actually appear on disk. */
void
sync ()
{
__set_errno (ENOSYS);
}
Run Code Online (Sandbox Code Playgroud)
所以这意味着sync除了设置值之外别无其他errno.
但是,当我在系统上反汇编/usr/lib/x86_64-linux-gnu/libc.a时,我发现同步部分进行系统调用,传递值162(所以它正在做某事).
再次在arch/x86/include/asm/unistd_64.h中查看Linux源代码,我看到:
#define __NR_sync 162
__SYSCALL(__NR_sync, sys_sync)
Run Code Online (Sandbox Code Playgroud)
现在我真的很困惑.
如果sync(2)在Linux之外定义,为什么有系统调用呢? …
我很难打电话给libc::statRust.我有这个:
extern crate libc;
use std::fs::File;
use std::os::unix::prelude::*;
use std::path::Path;
fn main() {
let p = Path::new("/");
let f = File::open(&p).unwrap();
let fd = f.as_raw_fd() as i8;
unsafe {
let mut stat: libc::stat = std::mem::zeroed();
if libc::stat(fd, &mut stat) >= 0 {
println!("{}", stat.st_blksize);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但现在我收到这个错误: error: mismatched types: expected *const i8, found i8
我找不到关于第一个参数如何工作的任何文档.从类型(i8)来看,我认为它必须是文件描述符.
背景:我正在阅读"UNIX环境中的高级编程",并希望在Rust中进行一些练习而不是C.
我目前正在学习printflibc 的功能,但我不了解,两者之间有什么区别:
printf("Test : %010d", 10);
Run Code Online (Sandbox Code Playgroud)
使用0标志和10宽度说明符
和
printf("Test : %.10d", 10);
Run Code Online (Sandbox Code Playgroud)
采用10精密符
产生相同的输出: Test : 0000000010
libc有random哪些
使用非线性附加反馈随机数发生器,采用大小为31的长整数的默认表来返回连续的伪随机数
我正在寻找一个用Rust编写的随机函数,速度相同.它不需要加密安全,伪随机就足够了.
仔细观察rand crate它似乎XorShiftRng最适合这种需求:
Xorshift算法不适用于加密目的,但速度非常快
当我像这样使用它时:
extern crate time;
use rand::Rng;
let mut rng = rand::XorShiftRng::new_unseeded();
rng.next_u64();
Run Code Online (Sandbox Code Playgroud)
它比libc随机慢约33%.(产生8'000'000个随机数的样本代码).
最后,我需要i64随机数,所以当我运行时,rng.gen()它已经比libc随机慢100%.当铸造时rng.next_u64() as i64,则慢60%.
有没有办法在不使用任何unsafe代码的情况下达到相同的生锈速度?
我一直在尝试在Rust中编写一个直接链接到libc库的shell .我用a Vec<String>来保存要传递的参数execvp(),但似乎我的转换char **没有成功.执行时,所有参数都变为空字符串.
这是涉及的代码片段.
fn safe_execvp(path: String, argv: Vec<String>) -> Result<(), i32> {
unsafe {
let c_path = CString::new(path.as_str()).unwrap();
let mut c_argv_vec = Vec::new();
for arg in &argv {
let c_arg = CString::new(arg.as_str()).unwrap().as_ptr();
c_argv_vec.push(c_arg);
}
c_argv_vec.push(std::ptr::null());
match execvp(c_file.as_ptr(), c_argv_vec.as_ptr()) {
num => Err(num),
}
}
}
Run Code Online (Sandbox Code Playgroud)
execvp是C库函数定义为fn execvp(file: *const i8, argv: *const*const i8) -> i32;.
我不确定我做错了什么.是因为参数的内存在调用之前被释放了execvp()吗?