当前位置: 首页 > news >正文

网站app制作百度推广是怎么做的

网站app制作,百度推广是怎么做的,自己做菠菜网站,小说网站签约作者应该怎么做文章目录 系统调用和POSIX标准系统调用表程序直接访问系统调用新增系统调用 在linux中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图: 系统内调用层主要作用: 为用户空间程序提供一层硬件抽象接口。保证系统稳定…

文章目录

    • 系统调用和POSIX标准
    • 系统调用表
    • 程序直接访问系统调用
    • 新增系统调用

在linux中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图:
在这里插入图片描述

系统内调用层主要作用:

  • 为用户空间程序提供一层硬件抽象接口。
  • 保证系统稳定和安全,应用陈续访问内核必须通过系统调用层,那么内核可以在系统调用层对应用的访问权限、用户类型和其他一些规则进行过滤。
  • 可移植性,可以让应用程序在不修改源代码的情况下,重新编辑便可在不同操作系统或不同架构系统上运行。

系统调用和POSIX标准

一般来说,应用程序调用用户空间实现的编程接口来编程,而不是直接调用系统调用。一个API接口函数可以由一个系统调用实现,也可以由多个系统调用实现,或者完全不由系统调用实现。因此,一个API接口和特定的系统调用之间并无对应关系。

在UNIX世界中,最通用的系统调用层接口是POSIX(Portable Operating System Interface of UNIX)标准。POSIX标准针对的是API而不是系统调用,判断一个系统是否与POSIX兼容,要看它是否提供一组合适的应用编程接口,而不是看它的系统调用是如何定义和实现的。

Linux操作系统中的API接口通常是以C 标准库的方式提供,比如libc库。C库中提供了POSIX的绝大部分的API实现,同时也为内核提供的系统调用封装了相应的函数。

系统调用表

Linux系统为每个系统调用赋予了一个系统调用号,系统调用号一旦分配之后就不会有任何变更,否则编译好的应用程序就不能运行了。
在x86_64上,其系统调用号定义在arch/x86/include/generated/uapi/asm/unistd_64.h:

#ifndef _UAPI_ASM_UNISTD_64_H
#define _UAPI_ASM_UNISTD_64_H#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
...
#define __NR_memfd_secret 447
#define __NR_process_mrelease 448
#define __NR_futex_waitv 449
#define __NR_set_mempolicy_home_node 450
#define __NR_cachestat 451
#define __NR_fchmodat2 452
#define __NR_map_shadow_stack 453#ifdef __KERNEL__
#define __NR_syscalls 454
#endif#endif /* _UAPI_ASM_UNISTD_64_H */

以open为例,其系统调用号为2,open函数最终的实现在fs/open.c

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{if (force_o_largefile())flags |= O_LARGEFILE;return do_sys_open(AT_FDCWD, filename, flags, mode);
}

SYSCALL_DEFINE*是一组专门用来定义系统调用的宏,其实现在include/linux/syscalls.h

#ifndef SYSCALL_DEFINE0
#define SYSCALL_DEFINE0(sname)					\SYSCALL_METADATA(_##sname, 0);				\asmlinkage long sys_##sname(void);			\ALLOW_ERROR_INJECTION(sys_##sname, ERRNO);		\asmlinkage long sys_##sname(void)
#endif /* SYSCALL_DEFINE0 */#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)#define SYSCALL_DEFINE_MAXARGS	6#define SYSCALL_DEFINEx(x, sname, ...)				\SYSCALL_METADATA(sname, x, __VA_ARGS__)			\__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

__SYSCALL_DEFINEx宏最后会扩展成__do_sys_open函数(在6.6.69版本是这样,较早的版本则不是,这个不是固定的)。

程序直接访问系统调用

可以通过syscall函数来直接访问系统调用而不需要通过C 标准库函数。

#define _GNU_SOURCE         /* See feature_test_macros(7) */#include <unistd.h>#include <sys/syscall.h>   /* For SYS_xxx definitions */long syscall(long number, ...);

下面测试下用syscall直接调用open系统调用:

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <fcntl.h>int main(int argc, char *argv[])
{int fd = syscall(SYS_open, "/tmp/call.log", O_CREAT);return 0;
}

运行程序后,可以看到成功创建了/tmp/call.log这个临时文件。

新增系统调用

Linux系统的系统调用必须由Linux社区来决定,并且和glibc社区同步,总之这个过程一般会很漫长。
为了实现用户程序和内核进行信息交互,除了系统调用,还可以使用下面的方法:

  • 设备节点。实现一个设备节点后,就可以对设备进行I/O操作了,也可以通过ioctl接口自定义一些操作
  • sysfs接口,可以让用户程序和内核直接通信,这种方式比较灵活,是linux内核推荐的方法
http://www.ds6.com.cn/news/115292.html

相关文章:

  • 基本的网站开发技术路线网络广告营销的案例
  • 做网站开票几个税点西安网站关键词排名
  • 厦门公司建站个人网站网页首页
  • 深圳市 交易建设中心网站优秀网页设计作品
  • 更换网站需要备案吗seo综合查询工具下载
  • 织梦中英网站怎么做百度网盘优化
  • 网站开发做什么宁波网站推广代运营
  • 域名备案和网站备案区别杭州企业seo
  • 软件外包公司哪个好搜索引擎优化方法
  • 视频网站怎么做每日新闻
  • 在阿里云上建立网站的步骤搜索指数查询平台
  • 做的好的手机网站企业网站建设案例
  • 做政府门户网站建设seo搜索引擎优化工作内容
  • wordpress上传视频媒体库没显示长春网站建设方案优化
  • 网络会议系统设备山东seo网页优化外包
  • 百度站长平台网页手机seo深圳培训班
  • 400网站建设网站建设方案书范文
  • 谢闵行搜索引擎优化技术有哪些
  • oracle自带网站开发免费cms建站系统
  • 做企业平台的网站拉新人拿奖励的app
  • php靓号网站源码湖南seo网站开发
  • 北京市西城区社会建设网站天堂tv在线观看
  • 每日财经新闻站长工具之家seo查询
  • 公司网站开发交接注意事项微营销推广平台有哪些
  • 网站建设主要工作流程关键时刻
  • 湖南营销推广网站多少费用店铺在百度免费定位
  • 网站建设技术jsp课程设计外贸网站推广与优化
  • 网站建设中山优化公众号运营收费价格表
  • 建筑网站哪一个比较靠谱今天发生的重大新闻内容
  • 建设局网站安徽营销中存在的问题及对策