GNU/POSIX

1.GNU

GNU该系统的基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils[14],另外也是GNU调试器(GDB)、GNU二进制实用程序(binutils[15]GNU Cash shell中[10] 和GNOME桌面环境。

参考GNU - 维基百科,自由的百科全书 (wikipedia.org)icon-default.png?t=N4P3https://zh.wikipedia.org/wiki/GNU

2.POSIX

 POSIX:可移植操作系統接口(Portable Operating System Interface of UNIX,縮寫爲 POSIX),参考下面链接。

posix 是什麼都不知道,就別說你懂 Linux 了! - 閱坊 (readfog.com)icon-default.png?t=N4P3https://www.readfog.com/a/1645003345925083136

POSIX 是一个标准,并不是软件库。

3.GNU 和 POSIX关系

GNU 库提供的API 遵从POSIX 标准。

glibc 是 Linux 下使用的開源的標準 C 庫,它是 GNU 發佈的 libc 庫,即運行時庫。這些基本函數都是被標準化了的,而且這些函數通常都是用匯編直接實現的。

glibc 爲程序員提供豐富的 API(Application Programming Interface),這些 API 都是遵循 POSIX 標準的,API 的函數名,返回值,參數類型等都必須按照 POSIX 標準來定義。

POSIX 兼容也就指定這些接口函數兼容,但是並不管 API 具體如何實現。

4.系统开销

有些库函数需要最终调用系统调用,比如fread/fwrite 等,有些库函数不用系统调用,比如strlen 等。

系统调用,需要在用户态和内核态之间进行切换,因此,系统调用的系统开销更大,单纯的库函数调用,系统开销较小。

5.trace 调用过程

在执行可执行程序时,带上strace 可以列出调用过程,比如

//source code

#include <stdio.h>
int main()
{
printf("\nHello World!");
return 0;
}

//编译:
test$ gcc main.c -o Hello

test$ gcc main.c -o Hello
test$ ls
Hello  main.c
test$ strace ./Hello 
execve("./Hello", ["./Hello"], 0x7ffea3ad8a30 /* 58 vars */) = 0
brk(NULL)                               = 0x5616cd4c9000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=269112, ...}) = 0
mmap(NULL, 269112, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8db3214000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\35\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030928, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8db3212000
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f8db2c3c000
mprotect(0x7f8db2e23000, 2097152, PROT_NONE) = 0
mmap(0x7f8db3023000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f8db3023000
mmap(0x7f8db3029000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f8db3029000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f8db32134c0) = 0
mprotect(0x7f8db3023000, 16384, PROT_READ) = 0
mprotect(0x5616cc876000, 4096, PROT_READ) = 0
mprotect(0x7f8db3256000, 4096, PROT_READ) = 0
munmap(0x7f8db3214000, 269112)          = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 7), ...}) = 0
brk(NULL)                               = 0x5616cd4c9000
brk(0x5616cd4ea000)                     = 0x5616cd4ea000
write(1, "\n", 1
)                       = 1
write(1, "Hello World!", 12Hello World!)            = 12
exit_group(0)                           = ?
+++ exited with 0 +++

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值