Tag: 系统编程

* nix select和exceptfds / errorfds语义

select系统调用需要3个文件描述符集,用于监视可读/可写的fds和filedescriptor上的“exception”。 我的select手册页没有提到exceptfd描述符集。 它是干什么用的; 什么样的exception可以和将通知文件描述符? 我假设这可以是不同的描述符types…无论是TCP套接字,pipe道,tty等)。 有没有人有更多的信息,哪些types的错误select可以报​​告不同types的描述符?

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

我想了解如何使我的程序成为一个守护进程。所以我碰到的一些事情是一般来说,一个程序执行以下步骤来成为一个守护进程: 调用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 == […]

为什么在memset上使用bzero?

在一个系统编程类中,我在上一学期学习了C语言,我们必须在C中实现一个基本的客户端/服务器。当初始化sock_addr_in或者char缓冲区(我们用来在客户端和服务器之间来回发送数据)时,教授指示我们只使用bzero而不是memset来初始化它们。 他从来没有解释为什么,我很好奇,如果有这个有正当的理由? 我在这里看到: http : bzero效率更高,因为它只是将内存调零,所以它不会“不得不做任何额外的memset可能做的检查。 这仍然不一定是绝对不使用memset来清零内存的原因。 bzero被认为是弃用的,而且不是一个标准的C函数。 根据手册, memset比bzero更受青睐。 那么,为什么你还想在memset使用bzero呢? 只是为了提高效率,还是更多? 同样的, memset优于bzero的好处是使它成为新程序事实上的首选。

以编程方式获取caching行大小?

所有平台欢迎,请指定您的答案的平台。 一个类似的问题: 如何以编程方式获取C ++中的CPUcaching页面大小?

为什么这个程序打印“叉”4次?

为什么这个程序打印“叉”4次? #include <stdio.h> #include <unistd.h> int main(void) { fork() && (fork() || fork()); printf("forked!\n"); return 0; }

如果指定文件被移动,删除,Linux上的打开文件处理程序会发生什么情况

Linux上的打开文件处理程序会发生什么情况: 移开 – >文件处理程序是否保持有效? 已删除 – >这是否导致EBADF,表明一个无效的文件处理程序? replace为新文件 – >文件处理程序是否指向这个新文件? 通过硬链接replace为新文件 – >我的文件处理程序“跟随”此链接吗? 用一个软链接replace一个新文件 – >我的文件处理程序现在是否打这个软链接文件? 为什么我问这样的问题:我正在使用热插拔硬件(如USB设备等)。 可能会发生,设备(也是/ dev / file)被用户或其他Gremlin重新连接。 处理这个问题的最佳做法是什么?