Linux-C编程
文章平均质量分 59
学习linux下的c编程过程漫长,希望与大家分享学习过程!包括linux基础与一些进程线程的知识,还有一些进程间通信的案例。
lanzhihui_
!
展开
-
Linux内核list_head使用示例
#include<linux/init.h>#include<linux/slab.h>#include<linux/module.h>#include<linux/kernel.h>#include<linux/list.h>struct student{ int id; char *name; struct list_head list;};static void testlist_exit(void){ .原创 2022-02-26 17:46:25 · 565 阅读 · 0 评论 -
Linux编程之epoll测试
测试epoll能否监听普通文件。epoll是Linux系统中常用的多路复用I/O组件,可以用来监听socket的I/O操作,但是监听的都是fd,那么打开的普通文件fd可以被监听吗?测试代码://gcc epoll_file.c -o epoll_file#include<stdio.h>#include<sys/epoll.h>#include<fcntl.h>int main(){ struct epoll_event ev, event原创 2021-08-07 22:23:46 · 477 阅读 · 0 评论 -
Linux编程之epoll示例
基础原理理解请参考这篇:IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)select主要解决的问题:(详细请参考:select用法&原理详解(源码剖析))select/epoll区别:如果这篇文章说不清epoll的本质,那就过来掐死我吧!逻辑框架...原创 2021-08-07 21:22:31 · 917 阅读 · 0 评论 -
Linux编程之mmap示例
一、Linux下,针对we传统的读写文件一般来说,修改一个文件的内容需要如下3个步骤:把文件内容读入到内存中。修改内存中的内容。把内存的数据写入到文件中。过程如图 1 所示:如果使用代码来实现上面的过程,代码如下:...原创 2021-06-19 19:58:55 · 1763 阅读 · 0 评论 -
Linux文件操作函数open/read/write/lseek
此类函数定义在头文件:#include <unistd.h>read使用示例:#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>int main(){ int read_fd, size; char buffer[1024] = "\0"; .原创 2021-06-19 18:05:26 · 378 阅读 · 0 评论 -
Linux进程间通信--共享内存示例(信号量保证同步)
在Linux系统中,每个进程都有独立的虚拟内存空间,也就是说不同的进程访问同一段虚拟内存地址所得到的数据是不一样的,这是因为不同进程相同的虚拟内存地址会映射到不同的物理内存地址上。\n但有时候为了让不同进程之间进行通信,需要让不同进程共享相同的物理内存,Linux通过 共享内存 来实现这个功能。下面先来介绍一下Linux系统的共享内存的使用。...原创 2021-06-06 22:56:06 · 3465 阅读 · 0 评论 -
Linux内核导出符号及引用示例
引用参考:Linux内核中导出符号及其引用代码目录如下:Makefileobj-m +=calculate_lib.oobj-m +=test_demo.oobj-m += com_lib.oKDIR :=/lib/modules/$(shell uname -r)/buildPWD=$(shell pwd)modules: $(MAKE) -C $(KDIR) M=$(PWD) modulesclean: $(MAKE) -C $(KDIR) M=$(PW原创 2021-05-01 14:56:43 · 842 阅读 · 0 评论 -
Linux编程之select示例
基础原理理解请参考这篇:IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)select主要解决的问题:(详细请参考:select用法&原理详解(源码剖析))select需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection(使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求),在网络原创 2021-04-24 18:51:35 · 1179 阅读 · 0 评论 -
file_operations使用示例(实现read/write/ioctl)
Makefileobj-m:=test_tools.oKDIR:=/lib/modules/$(shell uname -r)/buildPWD:=$(shell pwd)default: $(MAKE) -C $(KDIR) M=$(PWD) modulesclean: rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers *Module.markerstest.ko/************原创 2021-04-05 18:40:02 · 5521 阅读 · 0 评论 -
linux学习之一---常用命令
交流学习!原创 2014-10-05 13:52:46 · 1239 阅读 · 0 评论 -
linux学习之二---gcc与g++
交流学习!原创 2014-10-05 19:59:46 · 1027 阅读 · 0 评论 -
linux学习之三---gcc编译过程
gcc编译过程:在使用gcc编译程序时,编译过程分为4个阶段。(1)预处理(2)编译(3)汇编(4)链接Linux程序员可以根据自己的需要让gcc在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其他常用的编译器一样,gcc也提供了灵活而强大的代码优化功能,利用它可原创 2014-10-05 20:40:26 · 1090 阅读 · 0 评论 -
linux学习之四---gdb调试
在Linux应用程序开发中,最常用的调试器是gdb。一、启动和退出gdbgdb调试的对象是可执行文件,而不是程序的源代码。如果要使一个可执行文件可以被gdb调试,那么使用编译器gcc编译时需要加入-g选项,-g选项告诉gcc在编译时加入调试信息,这样gdb才可以调试这个被编译的程序。1.编译test.c源程序gcc -g test.c -o test./testte原创 2014-10-07 16:07:24 · 2003 阅读 · 0 评论 -
linux学习之五---条件编译
条件编译一般情况下,源程序中所有的行都会被编译。有时,我们希望程序中某一部分只在某个条件不成立或成立时才去编译,也就是对一部分内容指定编译的条件,这就是条件编译。条件编译使用范式范式一:#ifndef 标识符程序段1#endif其含义是:如果没有定义标识符,就编译程序段1,否则不编译程序段1。(范式一主要应用于确保文件多次包含仍能安全工作,使用该范式可以原创 2014-10-08 20:42:38 · 1995 阅读 · 0 评论 -
linux学习之六---__LINE__&__TIME__&__FUNCTION__&__FILE__
预编译器内置宏:_LINE_ :原创 2014-10-09 23:49:53 · 949 阅读 · 0 评论 -
linux学习之七---文件操作
Linux的文件操作API涉及到创建、打开、读写和关闭文件。1.linux API 创建int creat(const char *filename, mode_t mode); 参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限(mode&umask),其中umask代表了文件在创建时需要去掉的一些存取权限。u转载 2014-10-10 00:14:02 · 823 阅读 · 0 评论 -
linux学习之八---Linux进程基础知识
一、linux进程linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机;多任务是指linux可以同时执行几个任务。进程简单来说就是运行中的程序,Linux系统的一个重要特点是可以同时启动多个进程。根据操作系统的定义:进程是操作系统资源管理的最小单位。1.Linux进程的概念进程是一个动态的实体,是程序一次执行过程,并且进程是操作系统资源分配的基原创 2014-10-10 16:53:53 · 1564 阅读 · 0 评论 -
linux学习之九---孤儿进程
孤儿进程:如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,它由init进程收养,成为init进程的子进程。原创 2014-11-04 19:51:48 · 770 阅读 · 0 评论 -
linux学习之十---vfork()&fork()函数
vfork()也可以用来创建一个新进程,与fork()函数一样都是调用一次,返回两次,但它有自己的独特之处,区别如下:1.使用fork创建一个子进程,子进程完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。而使用vfork创建一个子进程,操作系统并不将父进程的地址可见完全复制到子进程,用vfork创建的子进程共享父进程的地址空间,也就是说子进程完全运行在父进程的地址空间原创 2014-11-04 21:29:38 · 907 阅读 · 0 评论 -
linux学习之十一---孤儿进程与僵尸进程
1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。2、基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的转载 2014-11-05 12:38:59 · 853 阅读 · 0 评论 -
linux学习之十二---exit(0)&exit(1)&return
exit()与return的区别:exit(0):正常运行程序并退出程序,调用时程序运行正常结束;exit(1):非正常运行导致退出程序,调用时程序运行非正常结束;return():返回函数,若在主函数中,则会退出函数并返回一值。本质上: 1. return返回函数值,是关键字; exit 是一个函数。 2. return是语言级别的,它表示了原创 2014-11-05 13:47:03 · 1662 阅读 · 0 评论 -
linux学习之十三---多线程的创建
多线程的创建在Linux下线程的创建通过函数pthread_create来完成,该函数的声明如下:#includeint pthread_create(pthread_t *thread, pthread_attr_t *attr,void*(*start_routine)(void*),void *arg);函数各参数含义如下:thread:该参数是一个指针,档线程创原创 2014-11-06 16:12:56 · 975 阅读 · 0 评论 -
linux学习值十四---线程终止pthread_exit()&pthread_join()
linux下有两种方式可以使线程终止。第一种通过return从线程函数返回,第二种通过调用函数pthread_exit()是线程退出。pthread_exit()函数原型:#include void pthread_exit(void* retval);参数retval:pthread_exit()调用线程的返回值,可以用pthread_join()函数来检索获取。功能:退原创 2014-11-07 12:36:18 · 15167 阅读 · 2 评论 -
linux学习之十五---多线程私有数据
linux多线程 私有数据在多线程环境下,进程内的所有线程共享进程的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部有效。线程私有数据采用立一种被称为一键多值的技术,即一个键对应多个数值。访问数据都是通过键值来访问,好像是对一个变量进行访问,其实是在访问不同的数据。使用线程私有数据时,首先要为每个线程数据创建一个相关联的键。在原创 2014-11-07 20:30:22 · 864 阅读 · 0 评论 -
linux学习之十六---互斥锁
线程最大的特点就是资源的共享性,然而资源共享中的同步问题是多线程编程的难点。Linux系统提供了多种方式处理线程间的同步问题,其中最常用的有互斥锁、条件变量和异步信号。1.互斥锁互斥锁是通过锁机制来实现线程间的同步。在同一时刻它通常只允许一个线程执行一个关键部分的代码。加锁函数:int pthread_mutex_lock(pthread_mutex_t *mutex);原创 2014-11-08 22:48:19 · 867 阅读 · 0 评论 -
linux学习之十六---条件变量pthread_cond_wait
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。1.加锁函数:pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);pthread_cond_t原创 2014-11-09 13:39:38 · 1290 阅读 · 0 评论 -
linux学习之十七---进程间通信的几种方式
进程间通信进程的地址空间是各自独立的,因此进程之间交互数据必须采用专门的通信机制。特别在大型的应用系统中,往往需要多个进程相互协作共同完成一个任务,这就需要使用进程间的通信编程技术。linux下进程间通信的几种主要方法:1.管道(pipe):管道是一种半双工的通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2.有名管道(name原创 2014-11-09 21:01:02 · 1091 阅读 · 0 评论 -
linux学习之十八---管道pipe&dup&dup2
1.管道的用法:进程在使用fork函数创建子进程前先创建一个管道,该管道用于在父子进程间通信,然后创建子进程,之后父进程关闭管道的读端,子进程关闭管道的写端。父进程负责向管道写数据而子进程负责读数据。也可以父进程关闭管道的写端,子进程关闭管道的读端。这样管道就可以用于父子进程间的通信,也可以用于兄弟进程间的通信。原创 2014-11-10 15:25:32 · 3372 阅读 · 0 评论 -
linux学习之十九---有名管道
有名管道:管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储与文件系统中。有名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO总是按照先进先出的原则工作,第一个被写入的数据原创 2014-11-10 21:41:25 · 1051 阅读 · 0 评论 -
linux学习之二十---消息队列
一、消息队列消息对类是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中,只有在内核重启(即操作系统重启)或者显式地删除一个消息队列时,该消息队列才会被真正删除。操作消息队列时,需要一些数据结构,熟悉这些数据结构是掌握消息队列的关键。1.消息缓冲队列结构2.msqid_ds内核数据结构3.ipc_perm内核数据结构原创 2014-11-12 16:20:38 · 1022 阅读 · 0 评论 -
linux学习之二十一---信号量
一、信号量1.信号量的基本概念信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源的访问的同步。临界资源可以简单的理解为在某一个时刻只能由一个进程或线程进行操作的资源,这里的资源可以是一段代码、一个变量或某种硬件资源。信号量的值大于或等于0时表示可供并发进程使用的资源实体数;小于0时代表正在等待使用临界资源的进程数。2.信号量的创建与使用linux下使...原创 2014-11-14 21:05:08 · 1211 阅读 · 1 评论 -
linux学习之二十二---进程间通信共享内存
共享内存1.共享内存就是分配一块能被其他进程访问的内存。每个共享内存段在内核中维护着一个内部结构shmid_ds(和消息队列、信号量一样),该结构体定义在头文件linux/shm.h中。2.共享内存的创建linux下使用函数shmget来创建一个共享内存区,或者访问一个已存在的共享内存区。该函数定义在头文件linux/shm.h中,原型如下:int shmget(key_t原创 2014-11-15 14:43:25 · 1079 阅读 · 0 评论 -
linux学习之二十二---命令行参数分析
命令行参数分析在学习命令行参数分析函数之前,我们必须首先理解带参数的main()函数,它的一般形式为:int main(int argc,char **argv)或int main(int argc,char *argv[])main()函数不能被其他函数调用,所以它的参数值从操作系统命令行获取。它有两个参数:argc和argv,其中argc为整型变量,代表命令行输入参原创 2014-11-16 16:02:42 · 775 阅读 · 0 评论 -
linux学习之二十三---共享内存
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一转载 2014-11-16 16:25:37 · 750 阅读 · 0 评论 -
linux学习之二十四---静态库的创建和使用
库的创建和使用1.Linux库的概念库是一种软件组建技术,库里面封装了数据和函数,提供给用户程序调用。库的使用可以使程序模块化,提高程序的编译速度,实现代码重用,使程序易于升级。Windows系统本身提供并使用了大量的库,包括静态链接库(.lib文件)和动态链接库(.dll文件)。类似的,Linux操作系统也使用库。Linux系统中,通常把库文件存放在/usr/lib或/lib原创 2014-11-17 10:46:54 · 845 阅读 · 0 评论 -
linux学习之二十五---ar的详细解释
1.ar基本用法 ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。 下面是ar命令的格式: ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive原创 2014-11-17 11:17:28 · 827 阅读 · 0 评论 -
linux学习之二十六---动态链接库
1.Linux库的概念库是一种软件组建技术,库里面封装了数据和函数,提供给用户程序调用。库的使用可以使程序模块化,提高程序的编译速度,实现代码重用,使程序易于升级。Windows系统本身提供并使用了大量的库,包括静态链接库(.lib文件)和动态链接库(.dll文件)。类似的,Linux操作系统也使用库。Linux系统中,通常把库文件存放在/usr/lib或/lib目录下。Linux库文原创 2014-11-17 14:20:01 · 823 阅读 · 0 评论 -
linux普通真实用户与root用户之间转换
用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同。用户的角色是通过UID来识别的,用户的UID是全局唯一的。Linux用户可以分为三类:1.root用户(超级用户):系统唯一,是真实的。该用户既可以登录系统,可以操作系统任何文件和命令,拥有最高权限。2.虚拟用户:这类用户也被称为伪用户或假用户,比如bin、daemon、adm、ftp、mail等;这类用原创 2014-12-10 20:26:39 · 3858 阅读 · 0 评论