Articles of 操作系统

关于这种情况下消息队列与共享内存的适用性或适用性

这是关于在这种情况下消息队列与共享内存的适用性或适用性: 多个DLL或共享库 每个库将尝试与我的主应用程序DLL或共享库进行通信,例如,所有DLL或共享库的I / P到O / P将通过我的主应用程序的共享库进行通信。 这些通信是asynchronous的。 一些DLL或共享库,除了我的应用程序的.so,将创build多个线程,每个这样的线程的输出需要传回到我的应用程序库。 这些线程的输出又是asynchronous的。 我的主要应用程序DLL / .so将继续与其他工作,这很可能是通过networking与一些服务器通信,并作出相应的响应 所有其他DLL / .so的function是asynchronous的 Q-1:在上述哪种情况下最合适? (I)消息队列,(II)共享内存? Q-2:使用共享内存在几个共享库之间强制同步的任何引用或链接?

当使用信号捕捉叉时程序变得无限

嗨,每一个,而做一些实验使用叉子和信号,我遇到了一个程序,显示非常有趣的行为,但经过数小时的努力,我无法弄清楚发生了什么事情。 我想要做的是我在主体内创build一个subprocess,然后打印“你好世界”,然后调用退出。 在这之后,我们完全明白它的信号处理程序会被调用,并且等待系统调用阻塞的父进程也会被调用。 现在我正在信号处理程序中创build另一个进程,但是从那里开始,输出变得无限。 输出是这样的:Hello world来到Linux来到UNIX来到Linux来到UNIX来到Linux来到UNIX来… 另外为什么来到Linux打印一遍又一遍。 也请告诉我什么时候拨叫,我知道重复的地址空间是由父母,但信号处理程序呢? 他们也得到重复吗? 在我的情况下,当小孩叫退出。 然后被调用的信号处理程序是孩子或父母。 请帮忙。 谢谢。 void sig_handler(int signo) { if(fork() == 0){ } else{ int pid = 0; wait(&pid); printf("Come to unix"); fflush(stdout); } } int main() { if (signal(SIGCHLD, sig_handler) == SIG_ERR){ } int child_pid; int i; child_pid = fork(); switch (child_pid) { case -1: perror("fork"); […]

页表项中的可执行位在哪里?

这是英特尔架构手册中的一个数字。 在x86 32位页表项中,哪里是指示页面是否可执行的位? 如果不在这里,操作系统如何为exec设置内存权限? 有像mmap函数?

添加一个新的系统调用到linux内核似乎不工作

我参加了一个操作系统课程,第一个分配是添加一些系统调用内核(Redhat,内核版本2.4)。 我添加了一些我认为需要添加的内容,但仍然无效。 我试图运行testing,我发现包装(我已经添加了一个下面的例子和它的sys_call代码)没有链接系统调用。 我知道这是因为我在系统调用中放置了一个printk,并且它们从不出现(而testing本身并没有给出我期待的结果)。 现在从我所了解的添加系统调用的开发过程是: 在说明中创build一个类似示例包装函数的包装器(让我们称之为服务“)。 将sys_aservice写入一个.c文件,该文件将转到linux-2.4.18-14custom文件夹中的许多文件之一。 它的文件取决于我想添加的服务的types(例如,如果它是一个文件系统服务,我把它放在FS)。 在/usr/src/linuxlinux-2.4.18-14custom/arch/i386/kernel/ entry.S表中添加系统调用条目 这是我一开始做的,但似乎不够(因为它似乎没有工作)。 我在网上查了一下(和阅读: 如何添加一个系统调用 ),我读了我需要添加/更改以下事情为了链接工作。 在系统调用的unistd.h中添加一行。 它会看起来像 定义__NR_aservice 添加aservice到生成文件。 所以,例如,如果我把aservice.c放在fs文件夹中,我会添加aservice.c到fs中的makefile。 创build一个aservice.h文件,它将会转到linux-2.4.18-14custom / include / linux(其中所有的h文件都会显示出来?)。 这个.h文件将包含一个名为“stub”的东西,它是由unistd.h中的一个macros自动生成的(这个.h文件必须包含),以便用户程序可以使用你的系统调用。 存根的声明如下所示:_syscallN(返回types,函数名称,arg1types,arg1名称…)“其中”N“是参数的数目。 在aservice.c的每个sys_X函数前面加上关键字“asmlinkage”(这需要包含linkage.h)。 所以函数声明如下所示:asmlinkage int sys_aservice(…){..}之后将.h文件包含在.c文件中。 这一切是正确的吗? 因为即使做了以下事情,似乎仍然没有调用系统调用。 这里是一个包装器和系统调用实现的例子: int stop_monitor(int pid){ long __res; __asm__ volatile ( "movl $244, %%eax;" << 244 is the entry in the sys_call table in entry.S […]

为什么显式调用os.mkdir()会比较慢?

我一直在做一个项目,必须创build一个大型的目录结构。 我的第一个解决scheme是保留所有dir存在的字典,如果它碰到一个没有使用os.makedirs()创build它和任何缺less的中介。 当我分析这个代码时,我发现绝大多数时间(132秒中有105个)花费在调用posix.stat()来确定中间目录不存在。 不过,我正在build立一个空目录的整个结构,所以我已经知道,没有中间目录将存在。 为了充分利用这一点,我写了一个代码版本,它保留和描述目录树结构的内部备忘录,以便它可以确定哪些目录已经被创build而不需要查询os: class DirTree: def __init__(self, root): self.root = os.path.abspath(root) self.tree = {} def makedirs(self, path): relpath = os.path.relpath(path, self.root).replace('\\', '/') built = self.root node = self.tree for directory in relpath.split('/'): built = os.path.join(built, directory) if directory in node: node = node[directory] else: node[directory] = {} node = node[directory] os.mkdir(built, 0777) 这段代码的运行速度更快,但是当我通过探查器运行时,与os.mkdir()相同的4068调用现在需要4倍(94而不是24)。 […]

最轻量级的Linux内核操作系统

我正在开发Linux Mint 17(由我创build的4.6MB大小的内核),并且正在开发Linux内核调度器的新增function。 问题是我每次都要编译和加载,这显然是一个很长的过程,大约需要3分钟的时间来完成。 是否有任何Linux操作系统具有如此小的基本内核configuration,我可以更快地完成我的工作? 我只需要一个terminal和一些基本的操作系统支持。 它必须在3.14版本或更高版本,因为截止date调度程序刚添加。

ps和ps -e命令在linux中有什么区别?

ps和ps -e命令在linux中有什么区别? ps -e给出一个更长的列表。

操作系统如何处理Python脚本的Python和subprocess?

我的问题有点独特。 我目前正在为我的计算机取证类做一个项目。 该项目旨在隐藏调查人员的磁盘数据。 应该达到的方法是将“干净”文件的字节写在“坏”文件上。 一旦覆盖,“坏”文件被删除。 这个概念听起来很简单,但我和我的合作伙伴观察到的是有趣的。 如果我们用python脚本打开一个文件,我们可以轻松地覆盖与该文件相关联的内存(使用ddvalidation)。 我们也可以从脚本中轻松删除一个文件。 然而,写入然后删除结果在实际上没有写入发生,只有文件的删除。 这从操作系统优化的angular度来看是有道理的。 从这一点来看,如果我们把写作和删除分成两个独立的脚本,并且由三分之一控制,我们认为它可能会起作用。 但是,即使我们将脚本作为另一个脚本的subprocess运行,也会发生同样的情况。 我们已经尝试使用bash脚本进行删除处理,而不是使用纯Python,而且还没有任何粘附。 这个项目本来就是这样一个小小的反辩证法工具,但是这个特定的项目由于这个问题已经引起了我们的全部关注。 有没有人有一个想法,为什么发生这种情况,我们可以做什么向前迈进? 我们知道这可以用C等来实现,但是我们想用python解决这个问题,因为它提供了有趣的约束。 —编辑—这是从我们的控制器的一个片段,它与相关的参数调用“ghost.py”。 ghost.py将编辑的文件名/path打印到标准输出。 相关的代码如下: proc = subprocess.Popen(['python', 'ghost.py', '-c', 'good.txt', '-d','/mnt/evil.txt'], stdout=subprocess.PIPE,) files = proc.communicate() for i in files: if i != None and i != "\n": os.system("./del.sh " + i)

你如何确定你正在运行最新的可执行文件?

每隔一段时间我(重新)编译一些我正在处理的C(或C ++)文件 – 顺便说一句,没有任何警告 – 然后我执行我的程序,只是意识到自从我以前的编译以来没有任何改变 。 为了简单起见,我们假设我给我的源添加了一条指令,将一些debugging信息打印在屏幕上,这样我就有了麻烦的直观证据:事实上,我编译,执行,并且意外地没有任何内容被打印到屏幕上。 当我有一个错误的代码(我跑出了一个静态数组的界限),这发生了一次。 当然,如果你的代码有某种隐藏的 bug( 一个C ++程序员应该知道的所有常见的未定义的行为是什么? ),编译的代码可以是任何东西。 当我使用一些速度慢得可怕的networking硬盘时,这种事情发生了两次,我猜 – 编译后没有更新我的可执行文件,尽pipe更新了源代码,我还是继续运行并运行旧版本。 我只是在这里推测,如果这种现象是不可能的,可以自由地纠正我,但是我怀疑它不得不在一些等待IO的进程上做些什么。 那么,当你在错误的目录中执行旧版本(即:执行类似的事情,但实际上完全与源无关)时,这样的事情当然会发生(而且确实如此)。 这又一次发生了,这让我感到很烦恼,请问:您如何确保您的可执行文件与您正在处理的源代码相匹配? 我应该比较主函数中的源代码和可执行文件的datestring吗? 我应该在编译前删除可执行文件吗? 我想人们可能会通过版本控制来做类似的事情。 注:我被警告说这可能是一个可能注定要closures的主观话题。

OpenELEC上apt-get的等价物

我目前正在开发一个以OpenELEC作为操作系统的树莓派。 不幸的是,apt-get不能用于这个发行版。 我有很多东西需要安装,而且如果没有apt-get的话就太长了。 所以我的问题是:你知道可以在OpenELEC上使用apt-get的任何等价命令,或者在这个操作系统上使用apt-get吗? 最后,哪个操作系统,你会build议我,所以我不再遇到这个问题了? 提前致谢。