首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux kernel + Glibc + Bash 能涵盖大部分 POSIX 接口规范吗?

这个问题是关于Linux内核、Glibc(GNU C库)和Bash(一种Unix shell)是否能够涵盖大部分POSIX接口规范。

Linux内核是一个开源的操作系统内核,它提供了一个稳定、安全、高性能的基础设施,以支持各种应用程序和服务。Glibc是一个广泛使用的C语言库,它提供了许多基本的函数和数据类型,以及一些与操作系统相关的接口。Bash是一个流行的命令行shell,它允许用户与操作系统进行交互,并执行各种命令和脚本。

POSIX(可移植操作系统接口)是一组用于操作系统和应用程序的API和命令的标准。它定义了一组接口,以确保不同的操作系统和平台之间的兼容性。Linux内核、Glibc和Bash都实现了POSIX接口的一部分,但是它们并不能完全涵盖所有的POSIX接口规范。

例如,Linux内核实现了POSIX的大部分进程、文件系统、网络和IPC接口,但是还有一些其他的接口,如实时调度和同步原语,它们并没有在Linux内核中实现。Glibc提供了许多POSIX接口的实现,例如stdio、stdlib、string和time等,但是还有一些其他的接口,如线程和进程控制,它们并没有在Glibc中实现。Bash实现了一些基本的POSIX shell接口,例如管道、重定向和变量替换等,但是还有一些其他的接口,如进程控制和信号处理,它们并没有在Bash中实现。

因此,Linux内核、Glibc和Bash并不能完全涵盖所有的POSIX接口规范,但它们提供了一个基本的、高度可移植的操作系统和应用程序接口。如果需要实现更完整的POSIX兼容性,可以考虑使用其他的软件库和工具,例如实现POSIX线程和进程控制的库,或者实现POSIX信号处理的工具。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux 之父如何定义 Linux?

来源:马哥教育链接:https://mp.weixin.qq.com/s/wwBt5H68tHmf_lHXrd_eSQ本文是 Linus 写于 1991年10月10日LINUX是什么?LINUX是一个免费类unix内核,适用于386-AT计算机,附带完整源代码。主要让黑客、计算机科学学生使用,学习和享受。它大部分用C编写,但是一小部分是用gnu格式汇编,而且引导序列用的是因特尔086汇编语言。C代码是相对ANSI的,使用一些GNU增强特性(大多为 __asm__ 和 inline)。然而有很多可用于386电脑的unices,他们大部分要花很多钱,而且不附带源码。因此他们是使用计算机的理想选择,但是如果你想了解他们如何工作,那是不可能的。也有一些 Unix 是附带源码的。Minix,Andrew S. Tanenbaum编写的学习工具,已经在大学中作为教学工具使用了很多年了。BSD-386系统是附带源码的,但是有版权限制,而且要花很多钱(我记得起始价格为$995)。GNU内核(Hurd)将会是免费的,但是现在还没有准备好,而且对于了解和学习它们来说有点庞大。LINUX与Minix是最相似的,由于它很小而且不是非常复杂,因此易于理解(嗯…)。LINUX是基于Minix编写的,因此有相当多的相同点,任何Minix黑客在使用LINUX的时候都感觉非常熟悉。不过,没有在项目中使用Minix代码,因此Minix版权没有限制到这个新系统。它也是完全免费的,而且它的版权非常宽松。因此不像使用Minix,它不需要几兆字节大小的区别。LINUX版权虽然是免费的发布版,我还是从以下几个方面限制了LINUX的使用:你可以自由复制和重新发布源码和二进制,只要是:1. 完全开源。因此不能单独发布二进制,即使你只修改了一点。2. 你不能从发布版获取利益。事实上甚至“装卸费用”都是不被接受的。3. 你要保持完整的适当版权。· 根据需要你可能会修改源码,但是如果你发布了新系统的一部分(或者只有二进制),必须将新的代码包含进去。· 除了不包含版权的代码之外,你可能会做一些小的修改。这由你来定,但是如果能将相关内容或者代码告诉我,将不胜感激。对任何使用或者扩展系统的人来说,这应该足够宽松而不会引起任何担忧。如果你有朋友真的不想要源码,只想要一个能运行的二进制,你当然可以给他而不用担心我会起诉你。不过最好只在朋友之间这么做。LINUX运行所需的硬件/软件LINUX是在一个运行Minix的386-AT上开发的。由于LINUX是一个真正的操作系统,而且需要直接与硬件交互来做一些事情,你必须有一个非常相似的系统来让他顺利运行:· 386-AT(PS/2之类是不同的,不能正常运行)· VGA或者EGA屏幕硬件。· 标准AT硬盘接口,IDE盘可以运行(实际上我用的就是这个)。· 正常实模式BIOS。一些机器看起来是用虚-86模式运行启动程序,而且在这样的机器LINUX不会启动和正常运行。LINUX会发展成为一个自给自足的系统,现在需要Minix-386才能正常运行。你需要Minix让初始化启动文件系统,和编译OS二进制。在那之后LINUX是一个自给自足的系统,但是为了做文件系统检查(fsck)和修改之后重编译系统,推荐使用Minix。获取LINUXLINUX现在可以使用匿名ftp从‘nic.funet.fi’的‘/pub/OS/Linux’目录获取。这个目录包含操作系统的所有源码,还有一些二进制文件,因此你可以真正使用系统了。注意!二进制大多是GNU软件,而且版权比LINUX的严格(GNU非盈利性版权)。因此你不能在不发布他们源码的情况下重新发布他们,可以在/pub/GNU中找到。关于GNU非盈利性版权,从任何GNU软件包了解更多。此目录中各类文件如下:· linux-0.03.tar.Z–系统的完全源码,16位tar压缩文件格式。· Linux.tex–这个文件的LATEX源码。· bash.Z–在LINUX下运行的bash二进制文件。这个二进制文件应该放到预留给LINUX文件系统中的/bin/sh下(参见installation)。· update.Z–更新二进制文件,要放到/bin/update。· gccbin.tar.Z–GNU cc二进制文件需要由一个可运行的编译器。这个tar压缩包含有编译器,加载器,汇编程序和支持程序(nm,strip等)。它还包含一个小型的库,可用于大部分程序。· include.tar.Z–让gcc运行的必要include文件。· unistd.tar.Z–unistd库程序的源码(即系统调用接口)。通过这个你可以使用系统独立库源码编译一个大一些的库。· utilbin.tar.Z–各种GNU工具的二进制文件,包括GNU的fileutils,make和tar。也包含克隆emacs的uemacs。· README, RELNOTES-

02

CentOS6.5升级自带glibc-2.12到glibc-2.15的过程解析(无需重启)

在开发时项目所依赖的包需要更高版本的glibc库支持, 而Centos6.5 中glibc默认版本为2.12, 这样调试时可能会遇到报错。但如果不小心把动态库中的libc.so.6给删了,瞬间所有的非系统命令都将无法使用,使用就报错。因为libc.so.6 是c运行时库glibc的软链接,而系统几乎所有程序都依赖c运行时库。程序启动和运行时,是根据libc.so.6 软链接找到glibc库。删除libc.so.6将导致系统的几乎所有程序不能工作。   每个glibc.so文件有它支持的libc版本,可以通过 strings /lib64/libc.so.6 |grep GLIBC 查看,一定要选择这条命令列出的版本。 [root@test1 ~]# strings /lib64/libc.so.6 |grep GLIBC GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_2.6 GLIBC_2.7 GLIBC_2.8 GLIBC_2.9 GLIBC_2.10 GLIBC_2.11 GLIBC_2.12 GLIBC_2.13 GLIBC_2.14 GLIBC_2.15 GLIBC_PRIVATE

02

menuconfig 配置选项详解

详细介绍内核配置选项及删改情况 第一部分:全部删除 Code maturity level options —> 代码成熟等级选项 []Prompt for development and/or incomplete code/drivers 默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.不选。 第二部分 :除以下选项,其它全部删除 General setup—〉 System V IPC (IPC:Inter Process Communication)是组系统调用及函数库,它能让程序彼此间同步进行交换信息。某些程序以及DOS模拟环境都需要它。为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。 第三部分:除以下选项,其它全部删除 Loadable module support —> 可引导模块支持 建议作为模块加入内核 [] Enable loadable module support 这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以移除它)。一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块了,否在无法启动系统。 []Automatic kernel module loading 一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使用modprobe命令来加载它,内核才能使用。不过,如果你选择了这个选项,在内核需要一些模块时它可以自动调用modprobe命令来加载需要的模块,这是个很棒的特性,当然要选Y喽。 第四部分:全部删除 Block layer—–〉块设备 第五部分:除以下选项,其它全部删除 Processor type and features —> 处理器类型 Subarchitecture Type (PC-compatible) —> 这选项的主要的目的,是使Linux可以支持多种PC标准,一般我们使用的PC机是遵循所谓IBM兼容结构(pc/at)。这个选项可以让你选择一些其它架构。我们一般选择PC-compatible就可以了。 Processor family(386) : 它会对每种CPU做最佳化,让它跑的好又快,一般来说,你是什么型号的就选什么型号的就好。我选的是386,这样内核会省下不少空间 第六部分:除以下选项,其它全部删除 Power management options (ACPI, APM) —> 电源管理选项 [ ] Power Management Debug Support 电源管理的调试信息支持,如果不是要调试内核有关电源管理部份,请不要选择这项。 ACPI Support —〉高级电源接口配置支持,如果BIOS支持,建议选上这项 []Button 这个选项用于注册基于电源按钮的事件,比如power, sleep等,当你按下按钮时事件将发生,一个守护程序将读取/proc/acpi/event,并执行用户在这些事件上定义的动作比如让系统关机。可以不选择,根据自己的需求。 第七部分:除以下选项,其它全部删除 Bus options (PCI, PCMCIA, EISA, MCA, ISA) —> 总线选项 []PCI support PCI access mode (Any) —> PCI外围设备配置,强列建议选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。 第八部分:除以下选项,其它全部删除 Executable file formats —> Kernel support for ELF binaries ELF是开放平台下最常用的二进制文件,它支持不同的硬件平台。一定要选。 第九部分:除以下选项,其它全部删除 Networking Networking options —> []Unix domain sockets []TCP/IP networking 第十部分:除以下选项,其它全部删除 Device Drivers —>设备驱动 Block devices——-〉 []Compaq SMART2 support [] Compaq Smart Array 5xxx support []Loopback device support 大部分的人这一个选项都选N,因为没有必要。但是如果你要mount iso文件的话,你得选上Y

00

futex机制介绍「建议收藏」

1、概念 futex: a sort of fast, user-space mutual exclusion primitive. Futex是一种用户态和内核态混合的同步机制。首先,同步的进程间通过mmap共享一段内存,futex变量就位于这段共享的内存中且操作是原子的,当进程尝试进入互斥区或者退出互斥区的时候,先去查看共享内存中的futex变量,如果没有竞争发生,则只修改futex,而不用再执行系统调用了。当通过访问futex变量告诉进程有竞争发生,则还是得执行系统调用去完成相应的处理(wait 或者 wake up)。简单的说,futex就是通过在用户态的检查,(motivation)如果了解到没有竞争就不用陷入内核了,大大提高了low-contention时候的效率。 https://lwn.net/Articles/172149/ https://lwn.net/Articles/360699/ 2、futex的由来 为什么要有futex,他解决什么问题?何时加入内核的?我们来看下 经研究发现,很多同步是无竞争的,即某个进程进入互斥区,到再从某个互斥区出来这段时间,常常是没有进程也要进这个互斥区或者请求同一同步变量的。但是在这种情况下,这个进程也要陷入内核去看看有没有人和它竞争,退出的时侯还要陷入内核去看看有没有进程等待在同一同步变量上。这些不必要的系统调用(或者说内核陷入)造成了大量的性能开销。为了解决这个问题,Futex就应运而生。 前面的概念已经说了,futex是一种用户态和内核态混合同步机制,为什么会是用户态+内核态,听起来有点复杂,由于我们应用程序很多场景下多线程都是非竞争的,也就是说多任务在同一时刻同时操作临界区的概率是比较小的,大多数情况是没有竞争的,在早期内核同步互斥操作必须要进入内核态,由内核来提供同步机制,这就导致在非竞争的情况下,互斥操作扔要通过系统调用进入内核态。 我们来看一下程序 程序1: pthread_mutex_t lock; int count = 0; void thread1() { while(1) { pthread_mutex_lock(&lock); /* do something */ count++; pthread_mutex_unlock(&lock); } } void thread2() { while(1) { sleep(60); pthread_mutex_lock(&lock); count = 0; pthread_mutex_unlock(&lock); } } pthread_create(&tid1, NULL, thread1, NULL); pthread_create(&tid2, NULL, thread1, NULL);

01
领券