Articles of 系统编程

查找地址属于哪个页面

我可以在内存中轻松地find一个缓冲区的地址,如下所示: int main() { char buffer[100]; printf("%p\n, buffer); } 有什么办法可以打印出缓冲区所属页面的地址吗? [编辑]我在一台Linux机器上,确切地说是Ubuntu。 我很好奇32和64位版本。

在c中初始化数组,格式为:int a = {0,};`

我曾经看到一个数组初始化的来源int arr[3] ={0,}; 这是什么意思 ? 我通常使用这种格式int arr[3]={0}; 我可以知道有什么区别

在Linux和Windows下实现信号?

我对编程中使用信号并不陌生。 我主要工作在C / C ++和Python。 但是我有兴趣知道如何在Linux(或Windows)中实际实现信号。 在信号描述符表中的每个CPU指令之后,如果有任何注册信号被处理,操作系统是否会检查? 或者是负责这个的stream程pipe理器/调度器? 由于信号是asynchronous的,CPU指令在完成之前是否中断呢?

如何利用自己的编程语言来利用VDSO对象?

最近的Linux内核(至less在amd64上)提供了一个名为linux-vdso.so.1的魔术对象文件linux-vdso.so.1内核的系统调用接口抽象出来,允许内核select最佳的调用约定。 如果你用C写代码,glibc会自动使用这个对象。 现在,如果我想写一个程序而不使用glibc,我该如何使用这个对象呢? 它提供的接口是在什么地方logging的? 怎么样的调用约定?

struct sockaddr_un v / s sockaddr – C(Linux)

struct sockaddr与struct sockaddr_un有什么不同? 我知道我们在客户端 – 服务器模块中使用这些结构来将套接字绑定到套接字地址。我们使用一个cast操作符来接受struct sockaddr_un。 我想知道他们有多么不同/相似,为什么演员呢?

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

在许多语言的这个时代,对于每一项任务来说,似乎都有一种伟大的语言,我发现自己在专业上反对“ 只有C很快 ”的口头禅,在这个口号中,速度确实意味着“足够快”。 我和非常理性的开放的人一起工作,他们喜欢比较数字,我只有思想和意见。 你能帮我find通过主观意见,进入“现实世界”的方式吗? 您是否可以帮助我find有关其他语言是否可用于embedded式和(Linux)系统编程的研究? 我很可能会推出一个虚假的假设,将非常感谢研究向我展示这一点。 你能否连接或包括好的数字,以便将“这只是他/她的意见”的意见保持在最低限度。 所以这些是我特别的要求 记忆不是一个严重的限制 便携性不是一个严重的问题 这不是一个实时系统

如何仅在C中列出第一级目录?

在terminal中,我可以调用ls -d */ 。 现在我想要一个c程序来为我做这个: #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <unistd.h> int main( void ) { int status; char *args[] = { "/bin/ls", "-l", NULL }; if ( fork() == 0 ) execv( args[0], args ); else wait( &status ); return 0; } 这将是一切。 但是,当我尝试: char *args[] = { "/bin/ls", "-d", "*/", NULL […]

/ proc / pid / mem上的mmap

有没有人成功地在Linux内核2.6中映射/ proc / pid / mem文件? 我得到一个ENODEV(没有这样的设备)错误。 我的电话是这样的: char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset); 我已经通过查看/ proc / pid / maps文件进行了validation,debugging时执行到达此调用时,offset的值为堆栈顶部减PAGE_SIZE。 我也通过ptracevalidation过,mmap正在将errno设置为ENODEV。

如何制作一个进程守护进程

我想了解如何使我的程序成为一个守护进程。所以我碰到的一些事情是一般来说,一个程序执行以下步骤来成为一个守护进程: 调用fork( ) 。 在父亲中,调用exit( ) 。 这可以确保原始父节点(守护进程的祖父节点)满足其子节点终止,节点守护进程的父节点不再运行,守护进程不是进程组节点。 最后一点是成功完成下一步的要求。 调用setsid( ) ,为守护进程提供一个新的进程组和会话,两者都以它作为领导者。 这也确保该过程没有关联的控制terminal(因为该过程刚创build了新的会话,并且不会分配一个)。 通过chdir( )将工作目录更改为根目录。 这是因为inheritance的工作目录可以在文件系统的任何地方。 守护进程倾向于在系统的正常运行时间内运行,并且您不想保留一些随机目录,从而阻止pipe理员卸载包含该目录的文件系统。 closures所有文件描述符。 打开文件描述符0,1和2(标准input,标准输出和标准错误)并将其redirect到/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 == […]

C / C ++如何判断一个程序是否已经在运行?

在Windows环境中,我不想同时运行两个程序实例。 有关 使用互斥锁来防止同一程序的多个实例运行安全吗?