Articles of Linux操作系统

Windows上的系统调用本质上比Linux更慢吗?

我对系统调用的理解是,在Linux中,系统调用机制( int 0x80或其他)被logging并保证在不同的内核版本中是稳定的。 使用这些信息,系统调用直接在CRT库中实现,这样当我调用printf("a"); 这涉及到对系统调用被设置和激活的CRT的单个函数调用。 在理论上,这可以通过静态编译CRT(在Linux上不常用,但是可能性)来进一步改进,使得即使单个函数调用也可以被内联。 另一方面,Windows不logging甚至保证系统调用机制的一致性。 在Windows上进行系统调用的唯一方法是调用由CRT完成的ntdll.dll (或者其他一些*.dll ),因此涉及到两个函数调用。 如果CRT被静态使用,并且函数被内联(在Windows上比在Linux上稍微普遍),我们仍然把单个函数调用到ntdll.dll ,这是我们无法摆脱的。 所以在我看来,理论上Windows上的系统调用本质上会比较慢,因为他们总是需要做一个函数调用,而不是他们的Linux等价物。 这种理解(以及我上面的解释)是正确的吗? 注:我纯粹从理论上提出这个问题。 我知道在进行系统调用时(我认为总是涉及2个上下文切换 – 每个方向都有一个切换),额外函数调用的代价可能完全可以忽略不计。

boost :: filesystem和Unicode在Linux和Windows下

以下程序在Windows下的Visual Studio 2008中进行编译,都使用字符集“使用Unicode字符集”和“使用多字节字符集”。 但是,它不能在Ubuntu 10.04.2 LTS 64位和GCC 4.4.3下编译。 我在两种环境下都使用Boost 1.46.1。 #include <boost/filesystem/path.hpp> #include <iostream> int main() { boost::filesystem::path p(L"/test/test2"); std::wcout << p.native() << std::endl; return 0; } Linux下的编译错误是: test.cpp:6:错误:在'std :: wcout << p.boost :: filesystem3 :: path :: native()'中找不到'operator <<' 它看起来像我在Linux下boost :: filesystem不提供宽的string在path::本地(),尽pipeboost :: filesystem ::path已被初始化为一个宽string。 此外,我猜这是因为Linux默认为UTF-8和Windows到UTF-16。 所以我的第一个问题是,如何编写一个使用boost :: filesystem的程序,并在两个平台上支持Unicodepath? 第二个问题:当我在Windows下运行这个程序时,它输出: /test/test2 我的理解是native()方法应该将path转换为Windows下的本地格式,这是使用反斜杠而不是正斜杠。 为什么string以POSIX格式出现?

如何在Ruby中分割一个目录string?

在ruby,我能够做到 File.dirname("/home/gumby/bigproject/now_with_bugs_fixed/32/FOO_BAR_2096.results") 并得到 "/home/gumby/bigproject/now_with_bugs_fixed/32" 但现在我想将目录string拆分成单独的文件夹组件,即类似的东西 ["home", "gumby", "bigproject", "now_with_bugs_fixed", "32"] 有没有办法做,而不是使用 directory.split("/")[1:-1]

虚拟内存的澄清 – 分配大量的连续内存

我有一个应用程序,我必须在Windows上分配(使用新操作符)相当大的内存空间(数百MB)。 该应用程序是32位(我们现在不使用64位,即使在64位系统上),我启用/ LARGEADDRESSAWARE链接器选项能够使用4 GB的用户空间内存。 问题如果我需要分配,比如450 MB的连续内存,进程的虚拟地址空间需要有一个足够大的连续空间,而且物理内存不必在系统上被分割。 我问这个是因为我可以这样做,以便我的应用程序保留足够大的连续空间,但不知道系统上的其他应用程序是否会以这种方式影响我。 OS页面表是否需要将应用程序看到的连续虚拟地址转换为连续的物理地址?

types2虚拟主机是否受到与主机操作系统相同的限制?

主机操作系统是否对types2虚拟主机(即VirtualBox)的客户操作系统施加限制? 例如:在Ruby中,创buildsubprocess就像调用fork一样简单。 但是,不支持在Windows上分支,而是必须为multithreading产生一个完整的进程。 据我所知,这是操作系统的一个限制,而不是编程语言。 将Windows作为主机操作系统强制这些限制在Linux客户操作系统? 如何将给客户机操作系统的命令传递给主机操作系统?

什么是相当于在Win32 API中的Posix popen()?

是否有相当于Win32 API中的Linux / Unix stdio.h popen()函数? 如果是的话,我在哪里可以find它? 编辑:我需要知道这个补丁D标准库中的遗漏。 任何答案只能使用标准的Win32 API,不能使用MSVC特定的函数。 另外,如果它存在的话,我更喜欢一些不太可怕的东西。

如何用GDB和QEMUdebuggingLinux内核?

我是内核开发的新手,我想知道如何使用QEMU和gdb运行/debuggingLinux内核。 我其实读罗伯特·爱的书,但不幸的是,它不能帮助读者如何安装适当的工具来运行或debugging内核…所以我所做的是遵循本教程http://opensourceforu.efytimes.com / 2011/02 / kernel-development-debugging-eclipse / 。 我使用eclipse作为IDE在内核上开发,但是我想首先在QEMU / gdb下运行。 所以我到目前为止做的是: 1)编译内核: make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config) make -j4 2)一旦编译完成,我运行Qemu使用: qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage 在“停止”状态下启动内核 3)因此我必须使用gdb,我尝试下面的命令: gdb ./vmlinux 它正确运行,但是…现在我不知道该怎么做…我知道我必须使用远程debugging端口1234(Qemu使用的默认端口),使用vmlinux作为符号表文件debugging。 所以我的问题是:我应该怎么做才能在Qemu上运行内核,将debugging器附加到它上面,从而让它们一起工作,通过内核开发使我的生活更轻松。

使用pthread_cancel取消线程:好的做法或不好的

我在Linux上有一个C ++程序(CentOS 5.3)产生多个线程,在无限循环中执行一个任务并在一定的时间内hibernate。 现在,我必须取消正在运行的线程,以防万一发生新的configuration通知,并且新启动一组新的线程,为此我使用了pthread_cancel。 我观察到的是,即使接收到取消指示,线程也没有停止,甚至一些睡眠线程在睡眠完成后出现。 由于行为并不理想,所以在上述情况下使用pthread_cancel会引起对做法的好坏的质疑。 请在上述场景中对pthread_cancel用法进行评论。

我怎样才能把初始的inputinput进来,然后互动呢?

我希望能够在启动一个交互过程时注入一个初始命令,以便我可以这样做: echo "initial command" | INSERT_MAGIC_HERE some_tool tool> initial command [result of initial command] tool> [now I type an interactive command] 什么不行: 只是pipe道的初始命令不起作用,因为这导致stdin没有连接到terminal 写入/ dev / pts / [number]会将输出发送到terminal,而不是input到进程中,就好像它来自terminal 什么将会有缺点: 做一个命令,分出一个孩子,写入它的标准input,然后转发一切从它自己的标准input。 下行 – terminal控制的东西(如线条与字符模式)将无法正常工作。 也许我可以用代理伪terminal做些什么? 做一个修改后的xterm版本(我正在为这个任务启动一个),用命令行选项在遇到所需的提示string后注入其他命令。 丑陋。 做一个我试图运行的工具的修改版本,以便它接受命令行上的初始命令。 打破标准安装。 (顺便提一句,目前感兴趣的工具是android的adb shell – 我想在手机上打开一个交互式shell,自动运行一个命令,然后进行交互式会话)

用Python模拟Linux中的击键

我如何模拟python中的按键? 我也想同时按下多个键。 就像是: keystroke('CTRL+F4') 要么 keystroke('Shift+A')