Linux应用编程(1)

目录

1.CPU核的信息获取

2.CPU核的亲和性

3.Linux线程的自动运行

4. select()  判断IO接口是否准备好

5. 共享内存 mmap

6. ftruncate 改变文件大小


1.CPU核的信息获取

#include <sys/sysinfo.h>

int num = get_nprocs_conf();      /* Return number of configured processors.  */

返回CPU当前可用的核心数量。

#include <sched.h>

int idx = sched_getcpu();    /* Get index of currently used CPU.  */

返回CPU当前正使用的核心编号


2.CPU核的亲和性

#include <sched.h>

cpu_set_t cpuset;        // 新建一个CPU集
CPU_ZERO(&cpuset);       // 初始化这个CPU集
CPU_SET(3, &cpuset);     // 将核3加入CPU集中

if(pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset) == 0)
// 设置亲和性(affinity),让线程thread 绑定cpuset

一个典型的将 Linux线程和CPU核绑定的 操作。现在线程thread就运行在核3上了。

更多函数如下:

void CPU_ZERO (cpu_set_t *set);                 //初始化,设为空
void CPU_SET (int cpu, cpu_set_t *set);         //将某个cpu加入cpu集中 
void CPU_CLR (int cpu, cpu_set_t *set);         //将某个cpu从cpu集中移出
int CPU_ISSET (int cpu, const cpu_set_t *set);  //判断某个cpu是否已在cpu集中设置了 

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,const cpu_set_t * cpuset );
// 设置 某线程的CPU亲和性
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t * cpuset );
// 获取 某线程的CPU亲和性

3.Linux线程的自动运行

需要注意的是,因为phread属于第三方库,编译的时候要加上选项:

-lpthread

如果是Qt项目,在pro文件中添加:

LIBS += -pthread

 pthread线程在被创建后直接自动运行,默认是joinable可连接线程。只要main函数 (或者它们的调用者)不退出,就会一直运行。


4. select()  判断IO接口是否准备好

 意义:传入要监听的文件描述符集合(可读、可写或异常,一般用于网络socket文件 或者 重要库文件)开始监听,select处于阻塞状态,当有事件发生设置的等待时间timeout到了就会返回,返回之前自动去除集合中无事件发生的文件描述符,返回时传出有事件发生的文件描述符集合。

但select传出的集合并没有告诉用户集合中包括哪几个就绪的文件描述符,需要用户后续进行遍历操作。

函数原型

int select( int maxfdp, fd_set * readfds, fd_set * writefds, fd_set * errorfds, \

                struct timeval * timeout );

 maxfdp——传入参数,集合中所有文件描述符的范围,即最大文件描述符值+1
 readfds——传入传出参数,select调用时传入要监听的可读文件描述符集合,select返回时传出发生可读事件的文件描述符集合
 writefds——传入传出参数,select调用时传入要监听的可写文件描述符集合,select返回时传出发生可写事件的文件描述符集合
 errorfds——传出参数,select返回时传出发生事件(包括可读和可写)中异常事件的文件描述符集合
 timeout——传入参数,设置select阻塞的时间。若设置为NULL,则select一直阻塞直到有事件发生;
                                      若设置为0,则select为非阻塞模式,执行后立即返回;
                                      若设置为一个大于0的数,即select的阻塞时间,若阻塞时间内有事件发生就返回,否则时间到了立即返回

看个例子:

先获得IO或者文件描述符fd1fd2(以相应的读写mode打开),再放入文件描述符集合rd或者wd里面。交给select()进行监视。

一般与select()搭配还会用到这几个宏:

void FD_ZERO(fd_set * fdset);                  //清空fdset中所有文件描述符
void FD_SET(int fd, fd_set * fdset);            //添加文件描述符fd到集合fdset中
void FD_CLR(int fd, fd_set * fdset);           //将文件描述符fd从集合fdset中去除
int FD_ISSET(int fd, fd_set * fdset);           //判断文件描述符fd是否在集合fdset中

select()只有大于0,才说明确实等到事件发生了。这时用FD_ISSET()可以判断特定的文件或者IO是不是已经准备好了。

select()好就好在,可以在单进程的程序里,同时观察和监视好几个文件或者IO,而不必由用户自己进行多进程的设计。

参考: https://blog.csdn.net/weixin_49199646/article/details/109191381


5. 共享内存 mmap

Linux可以把文件映射到一块内存。所有对这块内存的读写改动,也会同步到该文件上。这样就可以让多个需要共享资源的进程读写这块共享内存,而不用频繁的打开关闭某个文件了。

例子:

 核心就是mmap()函数。

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

返回值
成功:返回创建的映射区首地址
失败:MAP_FAILED宏
函数参数

  • addr:指定映射的起始位置,通常设置成NULL,由系统指定
  • length:映射到内存的文件长度
  • prot:映射区的保护方式,最常用:
    读:PROT_READ
    写:PROT_WRITE
    读写:PROT_READ | PROT_WRITE
  • flags:映射区的特性,可以是
    MAP_SHARED:写入映射区的数据会写回文件,且允许其他映射该文件的进程共享
    MAP_PRIVATE:对映射区的会产生一个映射区的复制(copy-on-write),对此区域所做的修改不会写回原文件。
  • fd:由open()返回的文件描述符,代表要映射的文件
  • offset:以文件开始处的偏移量,必须是4k的整数倍,通常为0,表示从文件头开始映射。

得到了正确的内存指针addr,就可以对addr进行读写了。

另外为了获取文件长度,我们经常用lseek()来获取文件结尾位置,效果一样:

1) 欲将读写位置移到文件开头时:
lseek(int fildes,0,SEEK_SET);

2) 欲将读写位置移到文件尾时:
lseek(int fildes,0,SEEK_END);

3) 想要取得目前文件位置时:
lseek(int fildes,0,SEEK_CUR);

当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。

6. ftruncate 改变文件大小

使用ftruncate()可以改变文件大小,一般是用来变大,为了接下来的操作做准备

例子:

int ftruncate(int fd,off_t length);

返回值
执行成功则返回0,失败返回-1,错误原因存于errno。

参数

参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。

参数length是要改成的指定大小。

错误代码 errno
EBADF 参数fd文件描述词为无效的或该文件已关闭。
EINVAL 参数fd 为一socket 并非文件,或是该文件并非以写入模式打开。



 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux 应用编程是指在 Linux 操作系统上开发应用程序的过程。 Linux 操作系统是一种开源的操作系统,支持多种编程语言,如 C, C++, Python, Java 等。 在 Linux 上开发应用程序的过程包括以下几个步骤: 1. 安装必要的开发工具: 在 Linux 上开发应用程序,需要安装一些必要的开发工具,如编译器、调试器、版本控制系统等。 2. 选择合适的编程语言: Linux 支持多种编程语言,可以根据自己的喜好选择合适的语言进行开发。 3. 编写代码: 根据应用程序的功能和需求,编写代码。 4. 编译代码: 使用编译器将代码编译成可执行文件。 5. 调试代码: 如果程序存在错误或者 bug,可以使用调试器来查找并修复问题。 6. 打包应用程序: 将应用程序打包成可以在其他计算机上安装的格式,方便分发和使用。 ### 回答2: Linux 应用编程指的是在Linux操作系统下开发和编写应用程序的过程。Linux作为一个开源的操作系统,拥有广泛的应用领域,包括服务器、嵌入式系统、移动设备等,因此掌握Linux应用编程有着重要的意义。 先,Linux应用编程需要熟悉Linux操作系统的特性和架构。Linux的核心理念是多任务、多用户的设计哲学,因此在编写应用程序时需要充分利用Linux的进程、线程、信号等机制,实现程序的并发执行和资源的合理管理。 其次,Linux提供了丰富的系统和网络编程接口,使得应用程序可以直接访问底层的系统资源和网络功能。例如,可以利用Linux提供的文件操作接口读写文件,使用套接字编程实现网络通信,调用系统调用实现进程间通信等。 另外,Linux应用编程还需要掌握一些常用的开发工具和库。例如,用C/C++编写应用程序时,可以使用GNU工具链来进行编译和调试;可以使用标准库和第三方库来简化开发过程。此外,还可以使用Shell脚本编写一些自动化任务,提高开发效率。 在开发过程,还需要注意Linux的安全性和权限管理。Linux提供了严格的权限控制机制,要求应用程序必须拥有适当的权限才能执行某些操作。因此,在编写应用程序时要遵循最小权限原则,以及避免一些常见的安全漏洞。 总而言之,Linux应用编程是一门有挑战性的技术,需要掌握Linux操作系统的原理和特性,熟悉系统和网络编程接口,以及使用相关的开发工具和库。掌握了这些知识和技能,可以为Linux平台上的应用程序开发和优化提供支持,提高开发效率和程序性能。 ### 回答3: Linux 应用编程是指在Linux操作系统上进行软件开发和编程的过程。Linux是一种开源的操作系统,它提供了丰富的开发工具和库,使得开发人员可以轻松地编写各种应用程序。 Linux 应用编程可以分为两个主要方面:系统编程应用编程。 系统编程是指与操作系统直接进行交互,使用系统调用和库函数来开发底层的系统功能。如文件和进程管理,网络编程,设备驱动程序等。系统编程需要深入了解操作系统的内部工作原理和相关概念。 应用编程是指开发各种应用程序,例如桌面应用、服务器应用、嵌入式应用等。开发者可以使用各种编程语言如C、C++、Python等来进行应用编程,在Linux操作系统上构建功能丰富、高效稳定的应用程序。Linux提供了众多开发工具和库,如GTK+、Qt等图形界面开发库,以及MySQL等数据库工具,方便开发者进行应用程序开发。 Linux应用编程的好处有很多。先,Linux是开源的,开发者可以使用自己的方式自由定制和修改系统。这使得开发者能够更好地理解系统和进行调试。其次,Linux提供了丰富的开发工具和库,使得开发者可以轻松地编写各种应用程序。再次,Linux系统的稳定性和高效性使得开发的应用程序能够在一个可靠的环境下运行。 总结来说,Linux应用编程是基于Linux操作系统进行软件开发和编程的过程。通过系统编程应用编程,开发者可以构建功能丰富、高效稳定的应用程序。Linux的开源特性和丰富的开发工具使得开发者能够更好地掌握和使用系统,从而开发出更好的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值