标签: libc

如何在C中完成相当于"ulimit -n 400"的操作?

在开始用C编写的程序之前,我必须运行命令"ulimit -n 400"来提高允许打开文件的数量,但是有没有办法在C程序中执行相同的操作?

也就是说,增加该进程允许的打开文件描述符的数量.(我对每个线程限制不感兴趣.)

它是否涉及设置ulimits,然后分叉一个允许有更多打开文件的孩子?

当然,我可以编写一个运行ulimit的shell包装器,然后启动我的C程序,但感觉不那么优雅.我也可以通过bash或sh的源代码来查看它是如何在那里完成的 - 也许我会在这里得到答案.

还有关系,如果你想选择很多文件描述符,请看这里.

c unix linux glibc libc

3
推荐指数
2
解决办法
8721
查看次数

在哪里可以找到我的系统标准C库函数的实现?

例如,strrev()函数.我知道它是在string.h中声明的,我想知道它是如何实现的.那我的源代码在哪里?

操作系统:Windows XP SP3
IDE:Pelles C 6.50 RC3

c libc string.h

3
推荐指数
1
解决办法
2190
查看次数

开放线程安全吗?

两个线程同时调用open()可以吗?如何找到这个问题的答案?

假定调用不同的文件上进行操作,他们的标志可以O_RDONLY,O_WRONLY或者两者兼而有之.

c libc thread-safety

3
推荐指数
1
解决办法
2990
查看次数

寻找支持UTF8的格式化函数,如printf()等

我在使用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,也非常受欢迎.

c utf-8 libc qnx

3
推荐指数
1
解决办法
5179
查看次数

为什么C++'new'运算符的实现有效?

我发现AVR uCs的C++编译器不支持newdelete运算符,但也有一个快速修复:

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())?

c++ memory malloc avr libc

3
推荐指数
1
解决办法
182
查看次数

x86_64处理器的sync(2)Linux函数调用的定义在哪里

我正在尝试找到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之外定义,为什么有系统调用呢? …

c linux glibc libc linux-kernel

3
推荐指数
1
解决办法
1853
查看次数

Rust中的libc :: stat中的文件参数

我很难打电话给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.

libc rust

3
推荐指数
1
解决办法
299
查看次数

C printf 0标志和width属性与precision标志之间的差异

我目前正在学习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

c printf libc

3
推荐指数
2
解决办法
985
查看次数

生成随机数的最快方法

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代码的情况下达到相同的生锈速度?

random libc rust

3
推荐指数
1
解决办法
1511
查看次数

将Rust中的Vec <String>传递给C中的char**

我一直在尝试在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()吗?

unsafe libc execvp rust

3
推荐指数
2
解决办法
935
查看次数

标签 统计

libc ×10

c ×6

rust ×3

glibc ×2

linux ×2

avr ×1

c++ ×1

execvp ×1

linux-kernel ×1

malloc ×1

memory ×1

printf ×1

qnx ×1

random ×1

string.h ×1

thread-safety ×1

unix ×1

unsafe ×1

utf-8 ×1