Linux系统编程
文章平均质量分 57
「已注销」
这个作者很懒,什么都没留下…
展开
-
信号量_系统V
文章目录信号量概念工作原理semgetsemopsemctlIPC_PRIVATE信号量操作信号量概念 信号量可以让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问。 最简单的信号量是只能取0和1的变量,叫做二进制信号量,而可以取多个正整数的信号量被称为通用信号量。工作原理 信号量只能进行两种操作,即申请信号量P(sv)和释放信号量V(sv):P(sv):如果sv的值大于零,就给它减1;如果它的值为0,就挂起该进程的执行。V(sv):如果有其他进程因转载 2021-10-11 20:09:16 · 207 阅读 · 0 评论 -
信号量_POSIX
文章目录创建信号量控制信号量销毁信号量代码实例创建信号量 使用sem_init创建信号量:#include <semaphore.h>int sem_init ( sem_t *sem, int pshared, unsigned int value );sem:信号量对象。pshared:通常设为0。value:信号量的初始值。控制信号量 使用sem_wait和sem_post控制信号量:#include <semaphore.h>int sem_w转载 2021-10-10 19:40:47 · 69 阅读 · 0 评论 -
共享内存_mmap
文章目录mmap创建共享内存munmap普通映射匿名映射mmap mmap函数使得进程之间通过映射同一个文件实现共享内存。进程可以像访问内存一样对文件进行访问,不必调用read、write等操作。 mmap的函数原型如下,其返回值为文件映射到进程空间的地址:void *mmap ( void *addr, size_t len, int prot, int flags, int fd, off_t offset );addr:一般设置为NULL。len:映射到进程地址空间的字节数,从被映原创 2021-10-08 19:08:07 · 304 阅读 · 0 评论 -
共享内存_shmget
文章目录共享内存创建共享内存映射共享内存删除共享内存父子进程共享内存共享内存通信共享内存 共享内存是被多个进程共享的一部分物理内存。一个进程向共享内存写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。 如下图所示,共享内存的地址在进程A中的地址可能是0x5000,在进程B中的地址可能是0x7000,这是因为共享内存映射到不同进程当中的不同位置。 共享内存的实现分为2个步骤:使用shmget函数创建共享内存。使用shmat函数将创建的共享内存映射到具体的进程空间。创建共原创 2021-10-07 20:00:59 · 6723 阅读 · 2 评论 -
Linux互斥量
文章目录创建互斥量加锁解锁互斥量对比信号量静态分配互斥量动态分配互斥量 互斥量从本质上说就是一把锁,提供了对共享资源的保护访问。创建互斥量 在Linux中,创建互斥量有2种方式:对于静态分配的互斥量,可以把它设置为默认的mutex对象PTHREAD_MUTEX_INITIALIZER。对于动态分配的互斥量,要先通过pthread_mutex_init进行初始化,程序结束时使用pthread_mutex_destroy进行销毁。#include <pthread.h>int原创 2021-10-07 08:48:06 · 730 阅读 · 0 评论 -
Linux消息队列
文章目录基本概念ftokmsgget消息格式msgsndmsgrcvmsgctl操作消息队列基本概念 消息队列就是一个存储消息的链表,这些消息具有特定的格式,以及特定的优先级。 对消息队列有写权限的进程可以向其中添加新消息,对消息队列有读权限的进程则可以从其中读取消息。 消息队列是随内核持续的,只有在内核重启,或者删除一个消息队列时,该消息队列才会真正地被删除。 对消息队列的操作有下面3种:打开或创建消息队列。读写操作。获得或设置消息队列属性。ftok 消息队列的内核持续性转载 2021-10-05 19:09:08 · 2380 阅读 · 0 评论 -
Linux管道
文章目录基本概念管道创建管道关闭操作管道FIFO创建FIFO操作FIFO基本概念 管道是单向的、先进先出的的数据通道,它把一个进程的输出和另一个进程的输入连接在一起。写进程在管道的尾部写入数据,而读进程从管道的头部读出数据。数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。进程试图读空管道时,进程将阻塞;管道已经满时,进程再试图向管道写入数据,进程将阻塞。 管道包括无名管道和有名管道:无名管道用于父进程和子进程之间的通信。有名管道用于运行于同一系统中的任意两个转载 2021-10-05 17:33:37 · 159 阅读 · 0 评论 -
errno和strerror
文章目录errnostrerrorerrno 在调用Linux系统API的时候,可能出现一些错误,例如使用open有些时候会返回-1。这个时候需要知道失败的原因,于是全局变量errno就相当有用了。#include <stdio.h>#include <errno.h>#include <fcntl.h>int main ( void ) { int fd; extern int errno; if ( ( fd = open (原创 2021-10-05 17:28:52 · 173 阅读 · 0 评论 -
exit和_exit
exit与_exit最大的区别就在于:exit在执行之前,要清理I/O缓冲区中的内容。 程序1如下:#include "stdio.h"#include "stdlib.h"int main() { /* 程序1 */ printf ( "this is a test function!\n" ); printf ( "test exit" ); exit ( 0 );} 程序2如下:#include "stdio.h"#include "unistd.转载 2021-10-04 19:33:58 · 108 阅读 · 0 评论 -
stat函数
文章目录statfstatlstatstat 函数原型如下:#include <sys/stat.h>int stat ( const char *filename, struct stat *buf );该函数将filename的文件属性信息存储在buf指向的结构体中。如果函数执行成功,则返回值为0,失败则返回-1。 如果filename是一个符号链接,那么buf指向的结构体将存储该链接指向的文件的属性信息。#include <sys/stat.h>#incl原创 2021-10-04 13:50:17 · 778 阅读 · 0 评论 -
简易目录扫描程序
简易目录扫描程序如下:#include "stdio.h"#include "unistd.h"#include "dirent.h"#include "string.h"#include "sys/stat.h"#include "stdlib.h"void printdir ( char *dir, int depth ) { DIR *dp; struct dirent *entry; struct stat statbuf; if ( ( dp转载 2021-10-04 10:30:05 · 69 阅读 · 0 评论 -
目录操作函数
文章目录opendirreaddirclosedirchdirtelldirgetcwdmkdiropendir 函数原型如下:#include <sys/types.h>#include <dirent.h>DIR *opendir ( const char *path );该函数获取path目录下的所有文件和目录的列表。如果path是个文件,则返回值为NULL。readdir 函数原型如下:#include <dirent.h>struct原创 2021-10-04 10:28:03 · 226 阅读 · 0 评论 -
环境变量相关函数
文章目录getenvputenvenvirongetenv 其函数原型如下:#include <stdlib.h>char *getenv ( const char *name );该函数用来取得环境变量name的内容。如果函数执行成功,则返回指向该内容的指针,否则返回NULL。#include <stdlib.h>#include <stdio.h>int main() { char *p; if ( ( p = getenv (原创 2021-10-04 06:24:57 · 86 阅读 · 0 评论 -
Linux时间函数
文章目录常用时间类型time_tstruct tmstruct timevalstruct timespec常用时间函数timectimegmtimelocaltimemktimeasctimedifftime常用时间类型time_t time_t类型在time.h中定义:#ifndef __TIME_T#define __TIME_Ttypedef long time_t;#endifstruct tm tm结构在time.h中定义:#ifndef _TM_DEFINED#原创 2021-10-03 20:51:31 · 100 阅读 · 0 评论 -
exec函数族
文章目录execlexeclpexecvexecve exec启动一个新程序,替换原有的进程,而进程的PID不会被改变。execl 函数原型如下:#include <unistd.h>int execl ( const char *path, const char *arg1, ... );path是被执行程序名,包含完整路径。arg1至argn是被执行程序所需的命令行参数,以NULL结束。#include "sys/types.h"#include "sys/wai原创 2021-10-03 20:49:40 · 74 阅读 · 0 评论 -
wait和waitpid
文章目录waitwaitpidwait wait函数用于等待子进程的退出:#include <sys/types.h>#include <sys/wait.h>pid_t wait ( int *status );status用来保存子进程退出时的一些状态。如果不在意子进程的退出状态,可以设定status为NULL。 如果执行成功,wait会返回子进程的PID;如果没有子进程,则wait返回-1。#include <sys/types.h>#inc原创 2021-10-03 20:22:59 · 255 阅读 · 0 评论 -
fork和vfork
文章目录forkfork实例1fork实例2vforkvfork实例1vfork实例2fork fork函数的功能是创建子进程:#include <unistd.h>pid_t fork ( void ); fork的奇妙之处在于:它被调用一次,却返回两次。它可能有3种不同的返回值:在父进程中,fork返回新创建的子进程的PID。在子进程中,fork返回0。如果出现错误,fork返回一个负值。fork实例1 代码实例:#include "unistd.h"#i原创 2021-10-03 19:47:20 · 407 阅读 · 0 评论 -
Linux进程基础
文章目录定义进程互斥进程同步进程ID定义 进程是一个具有一定独立功能的程序的一次运行活动,其特点有:并发性、独立性和异步性。 进程的状态变换如下:进程互斥 操作系统中将一次只允许一个进程访问的资源称为临界资源。进程中访问临界资源的那段程序代码称为临界区。 进程互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。进程同步 一组并发进程按一定的顺序执行的过程称为进程间的同步,具有同步关系的一组并发原创 2021-10-03 19:40:54 · 56 阅读 · 0 评论 -
Linux多线程编程
Linux进程创建一个新线程时,线程将拥有自己的栈,因为线程有自己的局部变量。但与它的创建者共享全局变量、文件描述符和当前目录状态。进程与线程 在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种昂贵的多任务工作方式。 和进程相比,线程是一种非常节俭的多任务操作方式。运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。 对不同进程来说,它们具有独立的数据空原创 2021-08-03 05:41:40 · 193 阅读 · 0 评论 -
Linux信号总结
信号通信 很多条件可以产生一个信号:当用户按某些按键时,产生信号。硬件异常产生信号,例如除数为0、无效的存储访问等。进程用kill函数将信号发送给另一个进程。用户可用kill命令将信号发送给其他进程。信号类型 下面是几种常见的信号:SIGHUP:从终端上发出的结束信号。SIGINT:来自键盘的中断信号,即Ctrl-C。SIGKILL:该信号结束接收信号的进程。SIGCHLD:标识子进程停止或结束的信号。SIGSTOP:来自键盘Ctrl-Z,或调试程序的停止执行信号。SIG原创 2021-06-28 07:20:38 · 313 阅读 · 1 评论 -
Linux内核链表
linux内核链表不是在链表节点中包含数据,而是在数据结构中包含链表节点。其在linux内核中的定义为:struct autofs { char *name; int len; struct list_head list;}使用示例如下:#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include "linux/fs.h"#i原创 2021-07-25 11:03:45 · 173 阅读 · 0 评论 -
线程理论基础
多线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows NT、Linux。优点 使用多线程的理由之一:和进程相比,它是一种非常节俭的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈原创 2021-06-11 13:37:53 · 79 阅读 · 0 评论 -
库函数之文件访问
文件创建和打开FILE *fopen ( const char *filename, const char *mode );参数filename为打开的文件名(包含路径,缺省为当前路径);mode是打开模式,常见打开模式如下:模式说明r、rb只读方式打开w、wb只写方式打开,如果文件不存在,则创建该文件a、ab追加方式打开,如果文件不存在,则创建该文件r+、r+b、rb+读写方式打开w+、w+b、wb+读写方式打开,如果文件不存在,则创建该文件原创 2021-06-11 13:34:32 · 106 阅读 · 1 评论 -
系统调用之文件访问
文件编程 Linux文件编程可以使用两种方法:Linux系统调用和C语言库函数,前者依赖于Linux系统,后者与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。创建文件int creat ( const char *filename, mode_t mode );参数filename是要创建的文件名(包含路径,缺省为当前路径),mode为创建模式。常见创建模式如下:模式说明S_IRUSR可读S_IWUSR可写S_IXUSR可执原创 2021-06-11 13:33:02 · 114 阅读 · 1 评论 -
current指针
current指针的用法1:#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>static int __init my_init ( void ) { printk ( "[kernel init] %s %d\n", __func__, __LINE__ ); printk ( "[k原创 2021-06-11 11:12:45 · 451 阅读 · 1 评论