标签: systems-programming

168
推荐指数
7
解决办法
7万
查看次数

为什么使用bzero而不是memset?

在上一学期的系统编程课程中,我们必须在C中实现一个基本的客户端/服务器.初始化结构,比如sock_addr_in,或者char缓冲区(我们用来在客户端和服务器之间来回发送数据)教授指示我们只使用bzero而不是memset初始化它们.他从未解释过为什么,而且我很好奇是否有正当理由呢?

我在这里看到:http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdownbzero是更有效的,由于一个只能将要归零记忆的事实,所以也没有必须做任何额外的检查memset.尽管如此,这仍然不一定是绝对不能memset用于归零内存的理由.

bzero被认为已弃用,而且不是标准的C函数.根据手册,memset因此优先考虑bzero.所以,你为什么要仍然使用bzeromemset?只是为了提高效率,还是更多?同样,有什么好处memsetbzero,使它成为新的程序的事实上的首选?

c memset systems-programming

150
推荐指数
4
解决办法
8万
查看次数

如果指向的文件被移动,那么Linux上的打开文件句柄会发生什么

如果指向文件同时获得Linux上的打开文件句柄会发生什么:

  • 搬走了 - >文件句柄是否保持有效?
  • 已删除 - >这是否会导致EBADF,表明文件句柄无效?
  • 替换为新文件 - >文件句柄是否指向此新文件?
  • 替换为新文件的硬链接 - >我的文件是否处理"关注"此链接?
  • 替换为新文件的软链接 - >我的文件句柄现在是否触及此软链接文件?

为什么我问这样的问题:我使用的是热插拔硬件(如USB设备等).可能发生的是,设备(及其/ dev /文件)被用户或另一个Gremlin重新附加.

处理这个问题的最佳做法是什么?

linux file-io file linux-kernel systems-programming

96
推荐指数
3
解决办法
4万
查看次数

为什么这个程序打印"分叉!" 4次?

为什么这个程序打印"分叉!"4次?

#include <stdio.h>
#include <unistd.h>

int main(void) {

  fork() && (fork() || fork());

  printf("forked!\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c unix linux fork systems-programming

75
推荐指数
6
解决办法
1万
查看次数

如何制作进程守护进程

我试图理解如何使我的程序成为守护进程.所以我遇到的一些事情通常,程序执行以下步骤来成为守护进程:

  1. 打电话fork( ).
  2. 在父母中,打电话exit( ).这可以确保原始父级(守护程序的祖父级)满足其子级终止,守护程序的父级不再运行,并且守护程序不是进程组领导者.最后一点是成功完成下一步的要求.

  3. 调用setsid( ),为守护进程提供一个新的进程组和会话,两者都将其作为领导者.这也确保了进程没有关联的控制终端(因为进程刚刚创建了一个新会话,并且不会分配一个).

  4. 通过将工作目录更改为根目录chdir( ).这样做是因为继承的工作目录可以在文件系统上的任何位置.守护进程倾向于在系统正常运行时间内运行,并且您不希望保持一些随机目录打开,从而阻止管理员卸载包含该目录的文件系统.

  5. 关闭所有文件描述符.

  6. 打开文件描述符0,1和2(标准输入,标准输出和标准错误)并将其重定向到/dev/null.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>

int main (void)
{
    pid_t pid;
    int i;

    /* create new process */
    pid = fork ( );  
    if (pid == -1)  
        return -1;  
    else if (pid != 0)  
        exit (EXIT_SUCCESS);  

    /* create new session and process group */  
    if (setsid ( ) == -1) …
Run Code Online (Sandbox Code Playgroud)

c linux daemon systems-programming

67
推荐指数
1
解决办法
5万
查看次数

*nix select和exceptfds/errorfds语义

选择系统调用需要3个文件描述符集留意可读/写FDS和"例外"的文件描述符.

我的选择手册页没有exceptfd说明描述符集.它是干什么用的; 什么样的例外可以并且会通知文件描述符?

我假设这可能与描述符类型不同......无论是TCP套接字,管道,tty等等.有没有人有更多信息select可以报​​告哪种错误可以报​​告不同类型的描述符?

c unix select systems-programming

42
推荐指数
2
解决办法
8310
查看次数

64位Windows是否使用KERNEL64?

我正在用dumpbin查看一些库,我注意到所有64位版本都链接到KERNEL32.在64位Windows上没有KERNEL64吗?如果没有,为什么?

我的所有操作系统都是32位,所以我不能只看.谷歌搜索没有什么值得的,所以我怀疑没有KERNEL64,但我仍然很好奇为什么会这样.

编辑:我后来发现这非常有用. MSDN指南x64

windows dll 64-bit systems-programming

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

我们必须使用C"出于性能原因"

在这个多语言的时代,几乎每一项任务似乎都有一种很好的语言,而且我发现自己在专业上正在努力克服" 除了C很快 "之外的咒语,其中快速的意思是"足够快".我和非常理性的思想开放的人合作,他们喜欢比较数字,而我所拥有的只是想法和意见.你能帮助我找到主观意见并进入"现实世界"吗?

您是否可以帮我找到关于嵌入式和(Linux)系统编程可以使用其他任何语言的研究?我很可能会推动一个错误的假设,并非常感谢研究向我展示这一点.您可以链接或包含好的数字,以帮助将"这只是他/她的意见"评论保持在最低限度.


所以这些是我的特殊要求

  • 记忆不是一个严重的约束
  • 便携性不是一个严重的问题
  • 这不是一个实时系统

c linux embedded systems-programming

21
推荐指数
10
解决办法
7716
查看次数

关于alloca的使用和滥用

我正在研究一个软实时事件处理系统.我希望尽可能减少代码中具有非确定性时序的调用次数.我需要构造一个由字符串,数字,时间戳和GUID组成的消息.大概std::vectorboost::variant的.

我一直想用alloca在过去类似性质的代码中.然而,当人们研究系统编程文献时,总是会对这个函数调用提出大量警告.就个人而言,我不能想到过去15年中没有虚拟内存的服务器类机器,而且我知道Windows堆栈一次增长一个虚拟内存页面,所以我假设Unices也是如此.这里没有砖墙(再也没有),堆栈就像堆一样可能耗尽空间,那么是什么给出了?为什么人们没有超过阿洛卡?我可以想到许多负责任地使用alloca的用例(字符串处理任何人?).

无论如何,我决定测试性能差异(见下文),并且alloca和malloc之间存在5倍的速度差异(测试捕获了我将如何使用alloca).那么,有变化吗?我们是否应该谨慎对待风并使用alloca(包裹在a中std::allocator)每当我们完全可以确定物体的使用寿命时?

我厌倦了生活在恐惧中!

编辑:

好吧有限制,对于Windows来说这是一个链接时间限制.对于Unix来说,它似乎是可调的.似乎页面对齐的内存分配器是有序的:D任何人都知道通用的便携式实现:D?

码:

#include <stdlib.h>
#include <time.h>

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

using namespace boost::posix_time;

int random_string_size()
{
    return ( (rand() % 1023) +1 );
}

int random_vector_size()
{
    return ( (rand() % 31) +1);
}

void alloca_test()
{
    int vec_sz = random_vector_size();

    void ** vec = (void **) alloca(vec_sz * sizeof(void *));    

    for(int i = 0 ; i < vec_sz ; i++)
    {
        vec[i] = alloca(random_string_size()); …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management real-time micro-optimization systems-programming

20
推荐指数
2
解决办法
1万
查看次数

使用信号量实现N过程障碍

我目前正在接受以前迭代的OS考试培训,我遇到了这个:

实现"N进程障碍",即确保一组中的每个进程在其各自的执行中的某个时刻等待其他进程到达其给定点.

您有以下操作:

init(sem,value), wait(sem) and signal(sem)

N是任意数.我可以使它适用于给定数量的进程,但不适用于任何数字.

有任何想法吗?用伪代码回复是可以的,这不是一项任务,只是个人学习.

computer-science operating-system semaphore systems-programming barrier

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