总体而言,Linux操作系统是一个强大、灵活且可定制的操作系统,广泛应用于服务器、嵌入式系统、超级计算机等各种领域。
在Linux下开发时,命令行的使用是必不可少的,经常会在命令行运行各种命令,启动服务,启动应用程序,查看函数用法等等;运行这些命令时都会传入一些参数,比如:
Shell 本身是一个用 C 语言编写的程序, Shell 作为命令语言时,可以交互式地解释和执行用户输入的命令;作为程序设计语言时,支持定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
以下内容是劫持glib.c中标准printf函数的方法。是这篇 Docker容器内的监控命令数据修正思路的基础知识。对LD_PRELOAD熟悉可以不看。 ##劫持printf函数的Demo [root@garnett-vm-1-3nskg test_ld]# ls hijack_printf.c printf_hello.c root@garnett-vm-1-3nskg test_ld]# cat printf_hello.c #include <stdio.h> main() {
要对一个信号进行处理(除了无法捕捉的SIGKILL和SIGSTOP),需要为其注册相应的处理函数,通过调用signal()函数可以进行注册。
在实际的软件开发过程中,内存问题常常是耗费大量时间进行分析的挑战之一。为了更有效地定位和解决与内存相关的难题,一系列辅助工具应运而生,其中备受赞誉的Valgrind工具便是其中之一。事实上,笔者本人曾利用Valgrind工具成功地发现并解决了一个隐藏在软件中的bug,这充分体现了工具在开发过程中的重要性。
对于c语言当中,你好像没有看到有关于字符串定义的关键字,不像我们常规的整型、浮点型、字符类型、指针、数组、结构体等数据类型,都能够一眼就能看出他们是什么数据类型,但是如果你对c语言理解不是很深的话,那你可能就不能"享受"到这里面的"美味"用法了,既然标题都标注了这个,我也不卖关子,下面会有总结分享的。说完了c,那么对于我们的c++来说,它定义字符串就简单多了,因为有关键字来定义,你一看就知道。那么下面大家就随着我的笔步一起来看看究竟吧!
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。贴出来纯粹是聊胜于无。
一个程序内存分配: 下图是APUE中的一个典型C内存空间分布图(虚拟内存) 例如: #include int g1=0, g2=0, g3=0; int max(int i) { int m1
=============================================================================
工作上自己在Linux C/C++开发时,用的都是Oracle数据库,毕竟企业级应用追求稳定性好、安全可靠。业余时间做了一些WEB开发,接触到MySQL数据库比较多,也比较喜欢开源的MySQL。之前都是用PHP连接MySQL数据库,这里自己用C语言连接MySQL,执行一些简单的连接、查询操作、异常处理等操作。
============================================================================= 涉及到的知识点有:1、C语言库函数、字符输入函数:gets和fgets、字符输出函数:puts和fputs、 求字符串长度函数strlen、字符串追加函数strcat、字符串有限追加函数strncat、字符串比较函数strcmp、 字符串有限比较函数strcmp、字符串拷贝函数strcpy、字符串有限拷贝函数strncpy、 格式化字符串函数sprintf(输出)、格式化字符串函数sscanf(读取输入)、解析一个字符串、 字符串查找字符函数strchr、字符串查找子串函数strstr、字符串分割函数strtok、 atoi函数、atof函数、atol函数、解析一个字符串的高级应用。 2、函数的定义和声明、函数的形式参数(形参)与实际参数(实参)、函数的返回值类型和返回值、 return函数与exit函数(exit更猛,不受位置限制)、自定义一个函数,实现大小写字母的互相转换功能、 自定义一个函数,实现atoi的功能。 3、函数的递归、递归例子:有n个人排成一队、递归例子:将10进制数转化为二进制数、 递归例子:将10进制数转化为16进制、递归例子:菲波那切数列、递归的优点与缺点。 4、多个源代码文件程序如何编译、头文件的使用、解决预编译时会出现多次函数声明问题。 ============================================================================= C语言库函数
---- 今天分享一下在linux系统在实现对文件读写一些基本的操作,在这之前我们要掌握一些基本的技能在Linux环境。比如查看命令和一个函数的具体用法,就是相当于查手册,在Linux下有一个man手册非常有用: man查询手册 man 1 +命令 这里的1表示为查询的是Linux命令 man 2 xxx 这里的2表示为查询的是linux api man 3 xxx 这里的3表示为查询的是c库函数 在了解了这个后我们就可以开始来实现标题说的操作了。 一、在linux环境下常用文件接口函数:open、close、write、read、lseek。 二、文件操作的基本步骤分为: a、在linux系统中要操作一个文件,一般是先open打开一个文件,得到一个文件扫描描述符,然后对文件进行读写操作(或其他操作),最后关闭文件即可。 b、对文件进行操作时,一定要先打开文件,然后再进行对文件操作(打开文件不成功的话,就操作不了),最后操作文件完毕后,一定要关闭文件,否则可能会造成文件损坏 c、文件平时是存放在块设备中的文件系统中的,我们把这个文件叫做静态文件,当我们去打开一个文件时,linux内核做的操作包括:内核在进程中建立了一个打开文件的数据结构, 记录下我们打开的这个文件,内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内存中特定地址管理存放(叫动态文件) d、打开文件后,以后对这个文件的读写操作,都是针对内存中这一份动态文件的,而不是针对静态文件的。 当我们对动态文件进行读写后,此时内存中的动态文件和块设备中的静态文件就不同步了, 当我们close 关闭动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件。 三、为什么是这样操作? 以块设备本身有读写限制(回忆Nandflash、SD、等块设备的读写特征),本身对块设备进行操作非常不灵活。而内存可以按字节为单位来操作。而且进行随机操作。 四、文件描述符是什么? 1、文件描述符:它其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护这个动态文件的这些数据结构挂钩绑定上了。以后我们应用程序如果要操作这一个动态文件,只需要用这个文件描述符进行区分。简单来说,它是来区分多个文件的(在打开多个文件的时候)。 2、文件描述的作用域就是当前的进程,出了这个当前进程,这个文件描述符就没有意义了。 五、代码实现: 1、打开文件:
嗨,我正在写一个简单的程序,我要让这个程序打印出一个整数。 #include <stdio.h> int main() { int linux = 701; printf("%d", linux); return 0; } 够简单吧。真的吗? 我把它存成了 code.c 现在我编译并运行它: $ gcc code.c && ./a.out 糟糕!,编译失败,出现了下面的错误信息: code.c: In function ‘main’: code.c:4:6:
在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。
我们分别在windows系统和linux系统上使用代码做以下操作: 输出"HelloWorld"十次,每次输出后暂停500毫秒。
在Linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member)。已知结构体type的成员member的地址ptr,求结结构体type的起始地址。
当需要搜索包含很多正则表达式元字符的字符串时,例如$、^等,fgrep很有用,其通过指定搜索字符串包含固定字符,从而无需对每个字符进行转义用反斜杠,如果搜索的字符串包含换行符,则每行将被视为要在搜索中匹配的单个固定字符字符串。也就是说fgrep是用来搜索固定字符的,固定字符表示字符串是按字面意义解释的-元字符不存在,因此不能使用正则表达式,运行fgrep与使用-F选项运行grep效果相同。
我们在学习和编写C程序时,都是从main函数开始,main函数作为入口函数已经深深地印在我们的脑海中,那么main函数真的是C程序的入口函数吗?带着这个问题我们先来看下面一段代码。 1. 实验程序 示例代码 #include <stdlib.h> #include <stdio.h> static void __attribute__ ((constructor)) beforeMain(void) { printf("Before main...\n"); } int main(void)
可以确定的是,argc是传递给应用程序的参数个数,argv是传递给应用程序的参数,且第一个参数为程序名。
在C语言 程序员内功心法之程序环境和预处理 博文中,我们就学习到 – 一个程序要被运行起来需要经历四个阶段:预处理 (预编译)、编译、汇编、链接,下面我们来简单回顾一下这四个阶段会进行的操作。
相信诸位学习过Linux的小伙伴对这句话不陌生吧。Linux下一切皆文件,也就是说在冯诺依曼体系下的任何东西,均可视为文件?为什么能这么说呢?
使用安装tree命令之前要先保证自己处于root账户下,否则没有权限执行次命令.
上一篇我们已经基于我们的开发板搭好了一个基于boa的web服务器:实用 | 10分钟教你搭建一个嵌入式web服务器。这一篇接着分享如何使用网页来点灯。
bpftrace 是 Linux 高级追踪工具和语言。该工具基于 eBPF 和 BBC 实现了通过探针机制采集内核和程序运行的信息,然后用图表等方式将信息展示出来,帮助开发者找到隐藏较深的 Bug、安全问题和性能瓶颈。github主页介绍如下:
Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux 下pthread的实现是通过系统调用clone()来实现的。clone()是 Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的 多线程程序 pthread_create.c。 一个重要的线程创建函数原型:
license: "cc-by-nc-nd-4.0" description: "本文手把手指导如何创建一个可以执行的共享目标文件"
这个项目其实在很早之前就开始了,最初的目的是为它(Future3D)而准备的,因此最近一段时间利用晚上下班的时间以及周末的时间在完成,故很少更文。
一、BMP图片顺时针180°镜像 1.1 原图片 image.png 1.2 编译运行过程 [wbyq@wbyq linux_c]$ gcc app.c [wbyq@wbyq linux_c]$ ls 1.bmp 1.c 2.c 666.bmp 888.bmp a.out app.c test.c [wbyq@wbyq linux_c]$ ./a.out 传入的参数格式: ./a.out <原图片的名称> <新图片的名称> [wbyq@wbyq linux_c]$ ./a.out 888
linux软件安装 在windows安装软件是极其简单的事,无非就是下载,然后一路点击“下一步”即可。而在linux装软件就没那么简单了,尤其是对于新手而言,往往会手足无措,觉得linux很不好用。可一旦习惯了,就会惊叹于linux的强大,安装软件可以简单地用一句命令行解决从下载到安装的整个流程,比windows下的一键安装还要轻爽。也可以自己到官网下载源码,自己编译,甚至修改源码,真正自定义安装软件。 本系列文章主要讲解通过源码安装软件的原理以及方法。 我们知道,不管是windows,还是linux,最终
============================================================================= ============================================================================= 涉及到的知识点有: 一、fopen函数。 二、fclose函数。 三、getc 和 putc 函数 1、通过getc和putc读写指定的文件、2、拷贝文件的代码。(一个一个字节的拷贝)、 3、改进版的代码:通过命令行参数,实现指定文件名的拷贝、4、文件的加密解密操作。(用getc和putc函数实现)。 四、fgets 和 fputs函数 1、fgets 和 fputs函数、2、拷贝文件的代码。(一行一行字节的拷贝)、3、文件的加密解密操作。(用fgets和fputs函数实现)、 4、课堂练习:超大文件排序、5、解析文件内容并追加结果。 五、fprintf 和 fscanf函数 1、课堂练习:运行的结果是打印出这个文件中年龄第二大人的姓名。 ============================================================================= ============================================================================= 文件操作
通过GDB等调试器,可以检查一个软件线程当前的函数调用关系(backtrace),也就是a调用b,b调用c,c调用d之类的。 当出现异常时,Linux kerenl会自动打印当前的函数调用关系(backtrace),为定位问题提供了不少信息。 在Linux应用程序中,也可以打印当前的函数调用关系(backtrace),GNU为此提供了backtrace ( )和backtrace_symbols( )。以前曾经测试过,发现没有生效,backtrace ( )返回0。 最近测试,发现backtrace ( )能返回大于0的数,说明工作正常。 另外,在编译器增加选项“-fno-omit-frame-pointer”,在连接器增加选项“-rdynamic”,可以打印出更多信息。
文章目录 Linux——进程管理篇(详解fork和exec) 🚗如何在Linux编写与运行代码 编写 编译 运行 🚗进程管理 fork system exec 🚗总结 Linux——进程管理篇(详解fork和exec) 🚀🚀这篇文章,主要的目的就是帮助同学们完成操作系统的实验,因为考虑到很多同学第一次接触Linux,相当不习惯命令行的操作方式,所以我会详细来介绍,相信只要跟着步骤一步一步来,就一定能完成我们的实验,好了,我们接下来就来介绍吧! ---- 🚗如何在Linux编写与运行代码 🚀🚀做实验,首
2.一个不错的中文Linux手册:http://cpp.ezbty.org/manpage
从上面回顾重载函数的知识中,我们要注意到一点函数重载必须发生在同一作用域里面(其他两点问题不大),所以的构造函数和普通成员函数是可以构造重载的,而与全局函数是不可以构成重载的。
通过获取Linux中的 /proc/stat 文件中的内容可以获取系统内存的详细信息:
这个问题在C语言中看似简单,但是往往不注意也可能会引起大问题。如果这个对你有一点点帮助,那么就是值得的。
进程是操作系统中的一个重要概念,它是一个程序的一次执行过程,程序是进程的一种静态描述,系统中运行的每一个程序都是在它的进程中运行的。
本文代码都在Windows/VC++6.0下测试过, 在linux/g++下也没有问题。
操作系统:ubuntu18.04 X64位 和 嵌入式Linux操作(ARM)
在linux下使用C语言,通过调用Linux系统的目录访问API来实现一个类似于ls命令功能的小程序,主要是可以练习程序对命令的解析和目录API函数的使用。
1. 区分预处理代码 在C语言程序里,出现的#开头的代码段都属于预处理。 预处理:是在程序编译阶段就执行的代码段。 比如: 包含头文件的的代码 #include <stdio.h> #include <stdlib.h> #include <string.h> 下面列出C语言里常用的预处理代码段: 指令 描述 #define 定义宏 #include 包含一个源代码文件 #undef 取消已定义的宏 #ifdef 如果宏已经定义,则返回真 #ifndef 如果宏没有定义,则返回真 #if 如果给定条件为真,
(2)将libpython3.6m.so.1.0文件路径的目录添加到/etc/ld.so.conf :
要注意的是,有些命令不支持正则模式,比如fs、find等,有些是支持正则的,比如grep、awk、sed等。正则的语法和js中的正则几乎没有区别,下面仅简单罗列下常用的正则:
运行mytest.exe执行程序,会输出hello gwj,hello Linux...,紧接着调用sleep函数,休眠三秒
写这类教程的目的是, 熟悉Linux基本操作和嵌入式开发流程, 希望对你有所帮助.
这篇文章介绍Linux下线程的创建与基本使用案例,主要是案例代码为主;相关的函数详细介绍在上篇文章里已经介绍过了。
领取专属 10元无门槛券
手把手带您无忧上云