linux 系统调用–必要知识

开发知识点-NodeJs-npm/Pnpm/Yarn包管理器 Node.js 是一个基于 Chrome V8 引擎的开源免费跨平台的 JavaScript 运行环境。由于 Node.js 进程尝试加载 providers.dll 时没有指定 DLL 的绝对路径。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。攻击者可以在当前工作目录写入恶意 DLL 文件进行 DLL劫持攻击。Windows 会按照特定策略进行搜索以找到所需的 DLL 文件。Node.js 组件存在 DLL 劫持漏洞。快速的,节省磁盘空间的包管理工具。 阅读详情

1、关于进程的一些必要知识

先看一下进程在大学课本里的标准定义:“进程是可并发执行的程序在一个数据集合上的运行过程。”这个定义非常严谨,而且难懂,如果你没有一下子理解这句话,就不妨看看笔者自己的并不严谨的解释。我们大家都知道,硬盘上的一个可执行文件经常被称作程序,在Linux系统中,当一个程序开始执行后,在开始执行到执行完毕退出这段时间里,它在内存中的部分就被称作一个进程。

当然,这个解释并不完善,但好处是容易理解,在以下的文章中,我们将会对进程作一些更全面的认识。

2、Linux进程简介

Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为“进程调度(process scheduling)”的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。

在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(Process Control Block,简称PCB)。PCB中包含了很多重要的信息,供系统调度和进程本身执行使用,其中最重要的莫过于进程ID(process ID)了,进程ID也被称作进程标识符,是一个非负的整数,在Linux操作系统中唯一地标志一个进程,在我们最常使用的I386架构(即PC使用的架构)上,一个非负的整数的变化范围是0-32767,这也是我们所有可能取到的进程ID。其实从进程ID的名字就可以看出,它就是进程的身份证号码,每个人的身份证号码都不会相同,每个进程的进程ID也不会相同。

一个或多个进程可以合起来构成一个进程组(process group),一个或多个进程组可以合起来构成一个会话(session)。这样我们就有了对进程进行批量操作的能力,比如通过向某个进程组发送信号来实现向该组中的每个进程发送信号。

最后,让我们通过ps命令亲眼看一看自己的系统中目前有多少进程在运行:

$ps -aux    (以下是在我的计算机上的运行结果,你的结果很可能与这不同。)
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.4  1412  520 ?        S    May15   0:04 init [3]
root         2  0.0  0.0     0    0 ?        SW   May15   0:00 [keventd]
root         3  0.0  0.0     0    0 ?        SW   May15   0:00 [kapm-idled]
root         4  0.0  0.0     0    0 ?        SWN  May15   0:00 [ksoftirqd_CPU0]
root         5  0.0  0.0     0    0 ?        SW   May15   0:00 [kswapd]
root         6  0.0  0.0     0    0 ?        SW   May15   0:00 [kreclaimd]
root         7  0.0  0.0     0    0 ?        SW   May15   0:00 [bdflush]
root         8  0.0  0.0     0    0 ?        SW   May15   0:00 [kupdated]
root         9  0.0  0.0     0    0 ?        SW<  May15   0:00 [mdrecoveryd]
root        13  0.0  0.0     0    0 ?        SW   May15   0:00 [kjournald]
root       132  0.0  0.0     0    0 ?        SW   May15   0:00 [kjournald]
root       673  0.0  0.4  1472  592 ?        S    May15   0:00 syslogd -m 0
root       678  0.0  0.8  2084 1116 ?        S    May15   0:00 klogd -2
rpc        698  0.0  0.4  1552  588 ?        S    May15   0:00 portmap
rpcuser    726  0.0  0.6  1596  764 ?        S    May15   0:00 rpc.statd
root       839  0.0  0.4  1396  524 ?        S    May15   0:00 /usr/sbin/apmd -p
root       908  0.0  0.7  2264 1000 ?        S    May15   0:00 xinetd -stayalive
root       948  0.0  1.5  5296 1984 ?        S    May15   0:00 sendmail: accepti
root       967  0.0  0.3  1440  484 ?        S    May15   0:00 gpm -t ps/2 -m /d
wnn        987  0.0  2.7  4732 3440 ?        S    May15   0:00 /usr/bin/cserver
root      1005  0.0  0.5  1584  660 ?        S    May15   0:00 crond
wnn       1025  0.0  1.9  3720 2488 ?        S    May15   0:00 /usr/bin/tserver
xfs       1079  0.0  2.5  4592 3216 ?        S    May15   0:00 xfs -droppriv -da
daemon    1115  0.0  0.4  1444  568 ?        S    May15   0:00 /usr/sbin/atd
root      1130  0.0  0.3  1384  448 tty1     S    May15   0:00 /sbin/mingetty tt
root      1131  0.0  0.3  1384  448 tty2     S    May15   0:00 /sbin/mingetty tt
root      1132  0.0  0.3  1384  448 tty3     S    May15   0:00 /sbin/mingetty tt
root      1133  0.0  0.3  1384  448 tty4     S    May15   0:00 /sbin/mingetty tt
root      1134  0.0  0.3  1384  448 tty5     S    May15   0:00 /sbin/mingetty tt
root      1135  0.0  0.3  1384  448 tty6     S    May15   0:00 /sbin/mingetty tt
root      8769  0.0  0.6  1744  812 ?        S    00:08   0:00 in.telnetd: 192.1
root      8770  0.0  0.9  2336 1184 pts/0    S    00:08   0:00 login -- lei
lei       8771  0.1  0.9  2432 1264 pts/0    S    00:08   0:00 -bash
lei       8809  0.0  0.6  2764  808 pts/0    R    00:09   0:00 ps -aux

以上除标题外,每一行都代表一个进程。在各列中,PID一列代表了各进程的进程ID,COMMAND一列代表了进程的名称或在Shell中调用的命令行,对其他列的具体含义,我就不再作解释,有兴趣的读者可以去参考相关书籍。

3、getpid

在2.4.4版内核中,getpid是第20号系统调用,其在Linux函数库中的原型是:

#include<sys/types.h> /* 提供类型pid_t的定义 */
#include<unistd.h> /* 提供函数的定义 */
pid_t getpid(void);

getpid的作用很简单,就是返回当前进程的进程ID,请大家看以下的例子:

/* getpid_test.c */
#include<unistd.h>
main()
{
    printf("The current process ID is %d\n",getpid());
}

细心的读者可能注意到了,这个程序的定义里并没有包含头文件sys/types.h,这是因为我们在程序中没有用到pid_t类型,pid_t类型即为进程ID的类型。事实上,在i386架构上(就是我们一般PC计算机的架构),pid_t类型是和int类型完全兼容的,我们可以用处理整形数的方法去处理pid_t类型的数据,比如,用"%d"把它打印出来。

编译并运行程序getpid_test.c:

$gcc getpid_test.c -o getpid_test
$./getpid_test
The current process ID is 1980
(你自己的运行结果很可能与这个数字不一样,这是很正常的。)

再运行一遍:

$./getpid_test
The current process ID is 1981

正如我们所见,尽管是同一个应用程序,每一次运行的时候,所分配的进程标识符都不相同。

4、fork

在2.4.4版内核中,fork是第2号系统调用,其在Linux函数库中的原型是:

#include<sys/types.h> /* 提供类型pid_t的定义 */
#include<unistd.h> /* 提供函数的定义 */
pid_t fork(void);

只看fork的名字,可能难得有几个人可以猜到它是做什么用的。fork系统调用的作用是复制一个进程。当一个进程调用它,完成后就出现两个几乎一模一样的进程,我们也由此得到了一个新进程。据说fork的名字就是来源于这个与叉子的形状颇有几分相似的工作流程。

在Linux中,创造新进程的方法只有一个,就是我们正在介绍的fork。其他一些库函数,如system(),看起来似乎它们也能创建新的进程,如果能看一下它们的源码就会明白,它们实际上也在内部调用了fork。包括我们在命令行下运行应用程序,新的进程也是由shell调用fork制造出来的。fork有一些很有意思的特征,下面就让我们通过一个小程序来对它有更多的了解。

/* fork_test.c */
#include<sys/types.h>
#inlcude<unistd.h>
main()
{
    pid_t pid;
     
    /*此时仅有一个进程*/
    pid=fork();
    /*此时已经有两个进程在同时运行*/
    if(pid<0)
        printf("error in fork!");
    else if(pid==0)
        printf("I am the child process, my process ID is %d\n",getpid());
    else
        printf("I am the parent process, my process ID is %d\n",getpid());
}

编译并运行:

$gcc fork_test.c -o fork_test
$./fork_test
I am the parent process, my process ID is 1991
I am the child process, my process ID is 1992

看这个程序的时候,头脑中必须首先了解一个概念:在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是if(pid==0)……。

两个进程中,原先就存在的那个被称作“父进程”,新出现的那个被称作“子进程”。父子进程的区别除了进程标志符(process ID)不同外,变量pid的值也不相同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

  1. 在父进程中,fork返回新创建子进程的进程ID;
  2. 在子进程中,fork返回0;
  3. 如果出现错误,fork返回一个负值;

fork出错可能有两种原因:(1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。(2)系统内存不足,这时errno的值被设置为ENOMEM。(关于errno的意义,请参考本系列的第一篇文章。)

fork系统调用出错的可能性很小,而且如果出错,一般都为第一种错误。如果出现第二种错误,说明系统已经没有可分配的内存,正处于崩溃的边缘,这种情况对Linux来说是很罕见的。

说到这里,聪明的读者可能已经完全看懂剩下的代码了,如果pid小于0,说明出现了错误;pid==0,就说明fork返回了0,也就说明当前进程是子进程,就去执行printf(“I am the child!”),否则(else),当前进程就是父进程,执行printf(“I am the parent!”)。完美主义者会觉得这很冗余,因为两个进程里都各有一条它们永远执行不到的语句。不必过于为此耿耿于怀,毕竟很多年以前,UNIX的鼻祖们在当时内存小得无法想象的计算机上就是这样写程序的,以我们如今的“海量”内存,完全可以把这几个字节的顾虑抛到九霄云外。

说到这里,可能有些读者还有疑问:如果fork后子进程和父进程几乎完全一样,而系统中产生新进程唯一的方法就是fork,那岂不是系统中所有的进程都要一模一样吗?那我们要执行新的应用程序时候怎么办呢?从对Linux系统的经验中,我们知道这种问题并不存在。至于采用了什么方法,我们把这个问题留到后面具体讨论。

5、exit

在2.4.4版内核中,exit是第1号调用,其在Linux函数库中的原型是:

#include<stdlib.h>
void exit(int status);

不像fork那么难理解,从exit的名字就能看出,这个系统调用是用来终止一个进程的。无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。请看下面的程序:

/* exit_test1.c */
#include<stdlib.h>
main()
{
    printf("this process will exit!\n");
    exit(0);
    printf("never be displayed!\n");
}

编译后运行:

$gcc exit_test1.c -o exit_test1
$./exit_test1
this process will exit!

我们可以看到,程序并没有打印后面的"never be displayed!\n",因为在此之前,在执行到exit(0)时,进程就已经终止了。

exit系统调用带有一个整数类型的参数status,我们可以利用这个参数传递进程结束时的状态,比如说,该进程是正常结束的,还是出现某种意外而结束的,一般来说,0表示没有意外的正常结束;其他的数值表示出现了错误,进程非正常结束。我们在实际编程时,可以用wait系统调用接收子进程的返回值,从而针对不同的情况进行不同的处理。关于wait的详细情况,我们将在以后的篇幅中进行介绍。

6、exit和_exit

作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案:

#define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */

“_NR”是在Linux的源码中为每个系统调用加上的前缀,请注意第一个exit前有2条下划线,第二个exit前只有1条下划线。

这时随便一个懂得C语言并且头脑清醒的人都会说,_exit和exit没有任何区别,但我们还要讲一下这两者之间的区别,这种区别主要体现在它们在函数库中的定义。_exit在Linux函数库中的原型是:

#include<unistd.h>
void _exit(int status);

和exit比较一下,exit()函数定义在stdlib.h中,而_exit()定义在unistd.h中,从名字上看,stdlib.h似乎比unistd.h高级一点,那么,它们之间到底有什么区别呢?让我们先来看流程图,通过下图,我们会对这两个系统调用的执行过程产生一个较为直观的认识。
在这里插入图片描述
从图中可以看出,_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序,也是因为这个原因,有些人认为exit已经不能算是纯粹的系统调用。

exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。

在Linux的标准函数库中,有一套称作“高级I/O”的函数,我们熟知的printf()、fopen()、fread()、fwrite()都在此列,它们也被称作“缓冲I/O(buffered I/O)”,其特征是对应每一个打开的文件,在内存中都有一片缓冲区,每次读文件时,会多读出若干条记录,这样下次读文件时就可以直接从内存的缓冲区中读取,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换行符\n和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就大大增加了文件读写的速度,但也为我们编程带来了一点点麻烦。如果有一些数据,我们认为已经写入了文件,实际上因为没有满足特定的条件,它们还只是保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,反之,如果想保证数据的完整性,就一定要使用exit()函数。

请看以下例程:

/* exit2.c */
#include<stdlib.h>
main()
{
    printf("output begin\n");
    printf("content in buffer");
    exit(0);
}

编译并运行:

$gcc exit2.c -o exit2
$./exit2
output begin
content in buffer
/* _exit1.c */
#include<unistd.h>
main()
{
    printf("output begin\n");
    printf("content in buffer");
    _exit(0);
}

编译并运行:

$gcc _exit1.c -o _exit1
$./_exit1
output begin

在Linux中,标准输入和标准输出都是作为文件处理的,虽然是一类特殊的文件,但从程序员的角度来看,它们和硬盘上存储数据的普通文件并没有任何区别。与所有其他文件一样,它们在打开后也有自己的缓冲区。

请读者结合前面的叙述,思考一下为什么这两个程序会得出不同的结果。相信如果您理解了我前面所讲的内容,会很容易的得出结论。

文章转自:https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part2/

Linux内核|实验七 系统调用实验 实验目的 学习Linux内核的系统调用,理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入、返回过程。 实验内容 向现有Linux内核加入一个新的系统调用从而在内核空间中实现对用户空间的读写。例如,设计并实现一个新的内核函数mycall(),此函数通过一个引用参数的调用返回当前系统时间,功能上基本与gettimeofday()相同。 阅读详情

相关推荐

Linux4.18.9添加系统调用传递参数示例

Linux4.18.9添加系统调用传递参数示例 做过系统调用的朋友们应该都注意到了,在Linux4.15之后的版本因为KPTI(内核页表隔离)的出现,添加自己的系统调用传递参数时并不能像以前版本一样处理,这里我介绍下自己的解决方案(完整步骤)。 1.下载最新源码 在https://www.kernel.org/上下载最新内核源码 本文编辑时最新稳定版本为4.18.9,下载后拷贝到/usr/src目...

刹那清枫 5143

npm、yarn、pnpm如何清除缓存?

前端各包管理器清除缓存攻略教程npm、yarn、pnpm清除缓存方法

任磊 4万+

Linux复习——总结篇

本篇涵盖课程《Linux程序设计》考点,分为三部分,如下: 第一部分:Linux历史、基础知识、shell、Linux编程等内容 第二部分:部分常见的系统调用和I/O库函数 第三部分:部分编程复习题,包括了shell编程和c编程 第一部分——复习总纲 一、基础 1.Linux是谁开发的、是用什么语言开发的、Unix的开源精神——这些 2.分区的基本知识(今年不考?) 3.文件系统 ...

空夜's Blog 1万+

npm,yarn,pnpm 清理缓存

npm,yarn,pnpm 清理缓存

qq_40147756的博客 5176

Linux增加系统调用步骤和实例

添加系统调用步骤              ①    编写系统调用函数 sys_file_copy(char *,char*),然后添加到 /usr/mylinux/linux-3.2.13/kernel/sys.c,也就是新内核的源程序sys.c文件末尾;          ②    分配系统调用号:打开/usr/mylinux/linux-3.2.13/arch/x86/includ

zhangjiajie023的专栏 2079

清除npm、yarn和pnpm的缓存的方式和设置缓存位置

本文提供了npm、yarn和pnpm三大包管理器的缓存管理指南。主要内容包括:各工具的缓存清理命令(npm cache clean、yarn cache clean、pnpm store prune)、缓存路径查看与修改方法,以及不同系统下的默认缓存位置对比。实用建议涵盖:统一设置缓存路径提升管理效率、创建定期清理脚本、SSD优化配置技巧,以及Windows系统的权限解决方案。文末特别提示修改全局配置后需重启终端生效,并说明--global参数的作用范围。这些操作能有效解决开发者日常遇到的缓存问题,提升开发

JackieDYH的博客 937

Linux文件理解和系统调用

我们在学习C语言时可以使用fopen打开文件fclose关闭文件;那么是C语言帮我们打开的文件吗?其实并不是,语言没有这个能力,而是借助操作系统之手打开文件并进行操作,本篇将为大家介绍关于Linux下文件操作的系统调用,并介绍Linux系统如何组织和管理进程打开的文件!

ARMCSKGT的博客 8847

npm如何清空缓存并重新打包?

【代码】npm如何清空缓存并重新打包?

邓邓子的博客 7703

Linux下简单的系统调用

嵌入式汇编实现简单的系统调用

ven_kon的博客 2157

如何使你的直流电机闭环?(PID讲解)

看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

a2001444的博客 1万+

Win32逆向必备:X32dbg中窗口句柄查看与消息断点的高级用法

本文深入探讨了X32dbg在Win32逆向工程中的高级应用,重点解析窗口句柄查看与消息断点的实战技巧。通过MFC程序逆向案例,详细介绍了如何利用窗口句柄层次结构、条件断点设置及消息映射表定位等技术,快速捕获关键业务逻辑,提升逆向分析效率。

nginx7reverse的博客 1017

Linux Kernel中的系统调用分析

文章目录1、系统调用在Linux Kernel中的map表(系统调用的数组)2、系统调用的函数在Kernel中的实现3、系统调用的流程4、总结 1、系统调用在Linux Kernel中的map表(系统调用的数组) 在sys.c中定义了__SYSCALL宏 (kernel-4.19/arch/arm64/kernel/sys.c) #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *); 例如: _

baron-周贺贺-代码改变世界ctw 2116

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1007

Linux之kernel(7)系统调用源码分析

系统调用是指内核提供给用户线程,用于和内核自身进行交互的一组接口。这些接口可以让应用程序受限的访问硬件设备,创建新线程并于已有进程进行通信的机制,以及申请操作系统其他资源的能力。为用户空间提供一种硬件的抽象接口。系统调用保证了系统的稳定和安全。进程运行在虚拟的系统中,由系统提供访问内核的手段。系统调用是除了异常和陷入外,内核唯一的合法入口。Linux的系统调用比大部分操作系统都少得多,重点强调Linux系统调用的规则和实现方法。

梅花香自苦寒来,宝剑锋从磨砺出。 1324

UE4载具性能调优指南:从参数设置到实战优化

本文详细解析了UE4载具性能调优的关键技巧,从WheeledVehicle类构建到轮子参数、传动系统设置,再到物理属性与操控调校。通过实战案例分享,帮助开发者优化载具的速度、加速度等核心性能,提升游戏体验。特别适合需要精细调校载具物理特性的开发者参考。

weixin_29019241的博客 469

STM32F407最小系统硬件设计与CubeMX工程实践

嵌入式最小系统是MCU功能实现的物理基础,其核心涵盖供电网络、时钟架构、复位机制与调试接口四大模块。基于Cortex-M4内核的STM32F407对电源纹波、晶振稳定性及信号完整性提出严苛要求:模拟电源VDDA需<10mV纹波,HSE晶振布线须满足短距直连与匹配电容精准配置,SWD调试接口依赖50Ω阻抗控制与端接防护。这些硬件约束直接映射至STM32CubeMX配置——如RCC时钟树参数必须与实物晶振频率严格一致,GPIO模式需匹配外设电气特性(如I2C必选开漏),否则将引发通信失败或启动异常。典型应用场景

weixin_35592186的博客 173

Linux系统调用–OPEN

open是Linux系统中用于打开和可能创建一个文件的系统调用。当你打开一个文件时,系统会返回一个文件描述符(file descriptor),这是一个非负整数,之后的读写操作都会使用这个文件描述符。

weixin_44702665的博客 808

PX4从放弃到精通(五):PX4中的姿态表示方法及转换关系

文章目录机体坐标系与地理坐标系一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 机体坐标系与地理坐标系 在实际应用中,加速度计的测量轴是由运动平台安装固定此器件的轴向决定的。这些坐标轴就形成了载体坐标系,定义如下: 坐标原点设在载体质心(这样可简化运动方程的推导); y轴指向载体前方,称为横滚轴,横滚角以y轴为起始旋转轴而得到,符合右手定则; x轴与y轴夹角90°,指向载体横向,称为俯仰轴,俯仰角以x轴为起始旋转轴而得到,符合右手定则; z轴与x轴、y轴构成右手笛卡儿坐标系,指向载体垂直方向

超维空间科技的博客 8115

Linux产生死锁的必要条件和常见的锁种类

Linux产生死锁的必要条件和常见的锁种类

wtl666_6的博客 6326

vue2 - 详细实现播放AMR格式音频并实现自定义播放器样式,支持amr音频文件在线地址URL播放、调用服务端API接口获取二进制文件流amr形式、用户本地上传amr文件并实现立即播放(详细代码)

vue2,amr,amr文件播放,vue播放amr音频文件以及在线url跨域问题解决,vue使用audio标签播放amr音频,amr跨域解决,amr网页解码播放,文件上传后怎么播放,vue2播放.amr语音文件,api接口形式调用获取的amr如何播放,vue中如何使用audio元素播放AMR格式的文件,进度条,vue前端如何播放AMR格式的音频文件,vue播放语音文件AMR格式,播放amr格式音频AMR录音机,h5原生audio播放amr格式的音频,VUE2使用benz-amr-recorder 实现解码、

✅ 精选推荐文章 7415

基于STM32设计的智能门锁(微信小程序+手机APP等多种方式开锁)(188)

当前智能门锁项目是基于STM32微控制器、ESP8266-WIFI模块、OLED显示屏、指纹模块、蓝牙模块、门禁刷卡模块、烟雾检测模块、火光检测模块、温湿度检测模块等硬件设备开发的一种智能门锁系统

1万+

linux下的系统调用和库函数调用

一、linux的结构 在系统调用之前我我们先来了解一下linux系统的结构图: linux的结构如图: 操作系统在内核的基础上进行延伸,提供了一些基础服务的组件。操作系统是通过驱动程序来管理硬件的,对上就暴露出一些接口,供上层来进行调用,这些接口就被称为系统调用。 shell是被包裹在linux内核的外层,通过一些命令来对操作系统发出指令的人机交互界面。而库函数就是在系统调用的基础上

Payshent的博客 2935

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

系统调用——open、write、read和close

一、文件描述符 每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。 一般地,一个程序开始运行时,会自动打开3个文件描述符: 0——–标准输入———-stdin 1——–标准输出———-stdout 2——–标准错误———-二、write系统调用1.write系统调用的原型:#include <unistd.h>size_t write(

帅气的羊的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux 系统调用--概念入门

linux 系统调用–概念入门 1、什么是系统调用 Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。二者在使用方式上也有相似之处,在下面将会提到。 随Linux核心还...

凌云俯瞰 787

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

linux系统调用的使用例子,Linux增加系统调用步骤和实例

添加系统调用步骤① 编写系统调用函数 sys_file_copy(char *,char*),然后添加到/usr/mylinux/linux-3.2.13/kernel/sys.c,也就是新内核的源程序sys.c文件末尾;② 分配系统调用号:打开/usr/mylinux/linux-3.2.13/arch/x86/include /asm/unistd_32.h,添加一行#define...

weixin_39960145的博客 602

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

本文介绍了系统调用的一些实现细节。首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系。然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和参数,执行正确的系统调用函数,并把返回值带回用户空间。最后讨论了如何增加系统调用,并提供了从用户空间访问系统调用的简单例子。 参考 《Linux内核设计与实现》读书笔记(五)- 系统调

OSKernelLAB(gatieme) 4万+
上一篇: linux 系统调用--概念入门
下一篇: Linux--进程管理相关系统调用
瓦雪子
博客等级 码龄11年 107粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值