linux
畏天
心之所向,身之所往
展开
-
linux kernel学习笔记(打印所有进程部分信息)
//task_struct.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init_task.h>#include <linux/sched.h>MODULE_LICENSE("GPL");static int __init print_pid(void){ int task_cnt = 0;原创 2020-12-10 15:49:19 · 643 阅读 · 0 评论 -
内核学习笔记(打印,加载,卸载)
helloword.c#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>static int __init lkm_init(void){ printk("hello world\n"); return 0;}static void __exit lkm_exit(void){ printk("bye bye\n");}module_init(l原创 2020-11-12 10:41:05 · 155 阅读 · 0 评论 -
shell顺序执行
如果只是简单的需要执行多个命令,只需要在多条命令之间加上命令分隔符即可,如下:(先后打印hello和world) 若后面的命令执行需要依赖于前面的命令成功执行,则可以使用&&符号,如下:(删除一个不存在的文件,然后创建一个新文件) 若后面的命令执行需要依赖于前面命令的错误执行,则可以使用||符号,如下:(创建一个文件,删除,第一次删除成功,&&后面的...原创 2020-01-14 14:29:31 · 904 阅读 · 0 评论 -
linux目录项的状态(《linux内核设计与实现》笔记)
目录项对象有三种有效状态:被使用,未被使用和负状态。被使用 一个被使用的目录项对应一个有效的索引节点,并且该对象存在一个或多个使用者。 一个目录项处于被使用状态,意味着它正被VFS使用并且指向有效的索引节点,因此不能被丟弃。未被使用 一个未被使用的目录项对应一个有效的索引节点,但是VFS当前并未使用它。该目录项对象仍然指向一个有效对象,而且被保留在内存中以便需要时再使用它。 由...原创 2019-12-20 11:38:16 · 197 阅读 · 0 评论 -
函数chmod、fchmod和fchmodat(UNIX函数高级编程笔记)
chmod、fchmod和fchmodat这3个函数使我们可以更改现有文件的访问权限。#include <sys/stat.h>int chmod(const char *pathname, mode_t mode);int fchmod(int fd, mode_t mode);int fchmodat(int fd, const char *pathname, mod...原创 2019-04-14 18:43:13 · 683 阅读 · 0 评论 -
FIFO(UNIX环境高级编程笔记)
FIFO 有时被称为命名管道。未命名的管道只能在两个相关的进程之间使用,而且这两个相关的进程还要有一个共同创建了它们的祖先进程。#include <sys/stat.h>int mkfifo(const char*path, mode_t mode);int mkfifoat(int fd, const char *path, mode_t mode); ...原创 2019-04-26 17:59:27 · 241 阅读 · 0 评论 -
函数exec(UNIX环境高级编程笔记)
当进程调用一个exec函数时,该进程执行的程序完全替换成新程序,而新程序从其main函数开始执行。因为调用exec并不创建新进程,所以前后进程的ID并未改变。exec只是用一个磁盘上的新程序替换了当前程序的正文段、数据段、堆段和栈段。 有7种不同的exec函数可供使用,它们通常被称为exec函数,我们可以使用这7个函数中的任一个。 这些函数之间的第一个区别是前4个函数都是以路径名作为...原创 2019-04-17 21:13:21 · 290 阅读 · 0 评论 -
函数rename和renameat 符号链接(UNIX环境高级编程笔记)
函数rename和renameat 文件或者目录可以用rename或者renameat函数来进行重命名。|#include <stdio.h>int rename(const char *oldname, const char * newname);int renameat(int oldfd, const char *oldname, int newfd, const char...原创 2019-04-15 10:33:22 · 727 阅读 · 0 评论 -
创建和读取符号链接(UNIX环境高级编程笔记)
可以用symlink或symlinkat函数创建一个符号链接。#include<unistd.h>int symlink(const char *actualpath, const char *sympath);int symlinkat(const char *actualpath, int fd, const char *sympath); 函数创建了一个...原创 2019-04-15 11:15:11 · 280 阅读 · 0 评论 -
文件的时间(UNIX环境高级编程笔记)
使用4个stat函数可以获得文件相关的信息结构。对每个文件维护3个时间字段。stat 结构体struct stat {dev_t st_dev; /* ID of device containing file /ino_t st_ino; / inode number /mode_t st_mode; / protection /nli...原创 2019-04-15 11:47:00 · 249 阅读 · 0 评论 -
函数mkdir、mkdirat和rmdir(UNIX环境高级编程笔记)
用mkdir和mkdirat函数创建目录,用rmdir函数删除目录。#include <sys/stat.h>int mkdir(const char *pathname, mode_t mode);int mkdirat(int fd, const char *pathname, mode_t mode); 这两个函数创建一个新的空目录。其中 . 和 . . ...原创 2019-04-15 14:07:27 · 463 阅读 · 0 评论 -
读目录(UNIX环境高级编程笔记)
对某个目录具有访问权限的任一用户都可以读该目录,但是,为了防止文件系统发生混乱,只允许内核写目录。#include <dirent.h> DIR *opendir(const char *pathname);DIR *fdopendir(int fd); 两个函数返回值:若成功,返回指针;若出错,返回NULLstruct dirent *re...原创 2019-04-15 14:31:22 · 160 阅读 · 0 评论 -
函数chdir、fchdir和getcwd(UNIX环境高级编程笔记)
每个进程都有一个当前目录,此目录是所有搜索相对路径的起点。 进程调用chdir或者fchdir函数可以更改当前工作目录。#include <unistd.h>int chdir(const char *pathname);int fchdir(int fd); 在这两个函数中,分别用pathname和打开文件描述符来制定新的当前工作目录。 因为当前目录是...原创 2019-04-15 14:45:37 · 260 阅读 · 0 评论 -
函数unlink和unlinkat(UNIX环境高级编程笔记)
任何一个文件可有多个目录指向其i节点。创建一个指向现有文件的连接的方法是使用link函数或者linkat函数。#include <unistd.h>int link(const char *exitingpath, const char * newpath);int linkat(int efd, const char *exitingpath, const char *...原创 2019-04-15 09:35:37 · 2302 阅读 · 3 评论 -
管道(UNIX环境高级编程笔记)
管道在历史上是半双工的(即数据只能在一个方向上流动)。现在,某些系统提供全双工管道。 管道只能在具有公共祖先的两个进程之间使用。 管道是通过pipe函数创建的。#include <unistd.h>int pipe(int fd[2]) 返回值:若成功,返回0;若出错,返回-1 经由参数,fd返回两个文件描述符:fd[0...原创 2019-04-26 16:28:09 · 170 阅读 · 0 评论 -
文件长度 文件截断(UNIX环境高级编程笔记)
文件长度 stat结构成员st_size表示以字节为单位的文件的长度。此字段只对普通文件、目录文件和符号链接有意义。 对于普通文件,其长度可以是0,在开始读这种文件时,将得到文件结束(end-of-file)指示。对于目录,文件长度通常是一个数(如16或512)的整倍数。对于符号链接,文件长度是在文件名中的实际字节数。 (注意,因为符号链接文件长度总是由st_size指示,所以他并不包...原创 2019-04-14 19:07:22 · 445 阅读 · 0 评论 -
存储空间的分配(UNIX环境高级编程笔记)
(1)malloc,分配指定字节的存储区。此存储区中的初值不确定。 (2)calloc,为指定数量指定长度的对象分配存储空间。该空间的每一bit都初始化为0。 (3)realloc,增加或减少以前分配区的长度。当长度增加后,可能需要将以前分配区的内容移动到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域内的初始值则不确定。#include <stdlib.h&...原创 2019-04-17 13:53:48 · 277 阅读 · 0 评论 -
函数setjmp和longjmp(UNIX环境高级编程笔记)
如果需要在多层函数之间进行跳转,可使用非局部goto——setjmp和longjmp函数。非局部指的是,这不是由普通的C语言的goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数上。#include <setjmp.h>int setjmp(jmp_buf env); 返回值:若直接调用,返回0;若从longjm...原创 2019-04-17 14:18:39 · 152 阅读 · 0 评论 -
进程标识和函数fork和函数和vfork(UNIX环境高级编程笔记)
进程标识 每个进程都有一个非负整数表示的唯一进程ID。 虽然进程ID是唯一的,但是进程ID是可以复用的。 系统中有一些专用进程,但具体细节随着实现而不同。ID为0的进程通常为调度进程,常常被称为交换进程(swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也常常被称为系统进程。进程ID为1的通常是init进程,在自举过程结束时由内核调用。init通常读取与系统有关的...原创 2019-04-17 15:17:05 · 126 阅读 · 0 评论 -
文件系统(UNIX环境高级编程笔记)
我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统。i接地那是固定长度的记录项,它包含有关文件的大部分信息。 每个i节点中都有一个链接计数,其值是指向该文件i节点的目录项数。只有当链接计数减少到0时才可以删除改文件(也就是可以释放该文件占用的数据块)。这就是为什么“解除对一个文件的链接”操作并不总是意味着“释放该文件占用的磁盘块”的原因。这也是威慑么删除一个目录项函数被称之...原创 2019-04-14 19:52:46 · 143 阅读 · 0 评论 -
进程退出(UNIX环境高级编程笔记)
如果父进程fork了一个子进程,父进程先于子进程终止,子进程的父进程将改为init进程。其大致操作是:在一个进程终止时,内核诸葛检查所有活动进程,以判断它是否是正要终止进程的子进程,如果是,则该进程的父进程ID就更改为1。 内核为每个终止子进程保存了一定量的信息,当终止进程的父进程通过wait或waitpid时,可以获得这些信息。 内核可释放终止进程所使用的所有存储区,关闭所有打开文件...原创 2019-04-17 15:44:35 · 104 阅读 · 0 评论 -
函数wait和waitpid(UNIX环境高级编程笔记)
当一个进程退出或异常终止时,内核会向其父进程发送SIGCHLD信号。 调用wait或waitpid的进程会发生以下情况: (1)如果其所有子进程都还在运行,则阻塞。 (2)如果一个子进程已经终止,正等待父进程回收获取其终止状态,则取得该子进程的终止状态立即返回。 (3)如果没有任何子进程,则立即出错返回。#include <sys/wait.h>pid_t...原创 2019-04-17 16:24:27 · 151 阅读 · 0 评论 -
线程属性(UNIX环境高级编程笔记)
pthread接口允许我们通过设置每个对象关联的不同属性来细微调节线程和同步对象的行为。 可以使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。可以使用pthread_attr_init函数初始化pthread_attr_t结构。在调用pthread_attr_init以后,pthread_attr_t结构所包含的就是操作系统实现支持的所有线程属性的默...原创 2019-04-22 14:03:34 · 125 阅读 · 0 评论 -
守护进程编程规则(UNIX环境高级编程笔记)
(1)调用umask将文件模式创建屏蔽字设置为一个已知值。 (2)调用fork,然后使父进程exit。 (3)调用setsid创建一个新会话。然后使调用进程:(a)称为新会话的首进程,(b)成为一个新进程组的组长进程,(c)没有控制终端。 (4)将当前工作目录更改为根目录。某些守护进程可能会把当前工作目录更改到某个指定位置,并在此位置进行它们的全部工作。 (5)关闭不再需要的文...原创 2019-04-22 15:10:07 · 119 阅读 · 0 评论 -
流和FILE对象(UNIX环境高级编程笔记 )
流的定向(stream’s orientation)决定了所读、写的字符是单字节还是多字节的。当一个流最初被创建时,它并没有定向。若在未定向的流上使用一个单字节I/O函数,则将该流的定向设置为字节型的。若在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的。 当用标准I/O库打开一个文件时2,我们已经使一个流和一个文件相关联。 freopen函数清除一个流的定向;fwi...原创 2019-04-15 16:08:58 · 193 阅读 · 0 评论 -
XSI IPC(UNIX环境高级编程笔记)
每个内核中的IPC结构(消息队列、共享内存或信号量)都用一个非负整数的标识符(identifier)加以引用。 标识符是IPC对象的内部名。为使多个合作进程能够在同一个IPC对象上汇聚,需要提供一个外部命名方案。为此,每个IPC对象都与一个键(key)关联,将这个键作为该对象的外部名。 无论何时创建IPC结构,都应制定一个键,这个键的数据类型是基本结构数据类型key_t,通常在头文件&...原创 2019-04-27 10:42:08 · 168 阅读 · 0 评论 -
Ubuntu无法使用man查询库函数的解决方案
新租了一个服务器,准备man函数的时候提示No manual entry for xxx 解决方案:安装manpages, manpages-dev两个软件包。 输入命令:sudo apt-get install manpages manpages-dev 未安装之前: 安装之后: ...原创 2019-04-24 15:56:37 · 1175 阅读 · 0 评论 -
fcntl记录锁(UNIX环境高级编程笔记)
#include <fcntl.h>int fcntl(int fd, int cmd, …/* struct flock *flockptr */); 对于记录锁,cmd是F_GETLK、F_SETLK或F_SETLKW。第三个参数是一个指向flock结构的指针。struct flock { short l_type; / * Type o...原创 2019-04-24 16:31:14 · 165 阅读 · 0 评论 -
函数select(UNIX环境高级编程笔记)
I/O多路转接(I/O multiplexing)。为了事项I/O多路转接,先构造一张我们感兴趣的描述符(通常都不止一个)的列表,然后调用一个函数,知道这些描述符中一个已经准备好进行I/O时,该函数才返回、poll、pselect和select这3个函数使我们能够执行I/O多路转接。在从这些函数返回时,进程会被告知那些描述符已经准备好可以进行I/O。函数select 在所有POSIX兼容...原创 2019-04-24 17:14:17 · 394 阅读 · 0 评论 -
函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)
#include <unistd.h>unsigned int sleep(unsigned int seconds); 返回值:0或未休眠完的秒数 此函数使调用进程被挂起知道满足下面两个条件之一。 (1)已经过了seconds所指定的墙上时钟时间。(返回0) (2)调用进程捕捉到一个信号并从信号处理程序返回。(返回未休眠完的秒数)...原创 2019-04-20 11:47:22 · 5318 阅读 · 0 评论 -
寻址(UNIX环境高级编程笔记)
字节序 如果处理器架构支持大端(big-endian)字节序,那么最大字节地址出现在最低有效字节(Least Significant Byte, LSB)上。小端(little-dndian)字节序相反,最大字节地址出现在最低有效字节上。 下图显示了一个32位整数的字节是如何排序的: 网络协议指定了字节序,因此异构计算机系统能够交换协议信息而不会被字节序所混淆。 TCP/IP协议...原创 2019-05-07 20:44:35 · 222 阅读 · 0 评论 -
建立连接(UNIX环境高级编程笔记)
如果要处理一个面向连接的网络服务,在开始交换数据之前,需要在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接。使用connect函数建立连接。#include <sys/socket.h>int connect(int sockfd, const sockaddr *addr, socklen_t len); ...原创 2019-05-07 21:16:23 · 197 阅读 · 0 评论 -
数据传输(UNIX环境高级编程笔记)
只要建立连接就可以使用read和write来通过套接字通信。但read和write能够做的只有交换数据,无法提供更加复杂的操作。 函数send和write很相似,但是可以指定标志来改变处理传输数据的方式。#include <sys/socket.h>int send(int sockfd, const void *buf, size_t nbytes, int fla...原创 2019-05-07 22:23:04 · 149 阅读 · 0 评论 -
开发问题笔记
问题1:可以ping通局域网,但是无法ping通外网,显示网络无法抵达。 解决:未设置默认路由:运行route add default gw 192.168.1.1添加默认网关即可。 问题2:开发板的linux系统时间不同步 从http://doolittle.icarus.com/ntpclient/上下载一个ntpclient。 修改Makefile CC = arm-n...原创 2019-05-27 17:05:00 · 99 阅读 · 0 评论 -
冲洗所有打开的标准输出流
fflush(NULL);int fflush(FILE *stream);Description For output streams, fflush() forces a write of all user-space buffered data for the given output or update stream via the stream’s underlying w...原创 2019-04-19 16:23:34 · 203 阅读 · 0 评论 -
函数alarm和pause(UNIX环境高级编程笔记)
使用alarm函数可以设置一个定时器,在某一个时刻该定时器会超时。当定时器超时时,产生SIGALRM信号。如果忽略或者不捕捉此信号,则其默认动作是终止调用该alarm函数的进程。#include <unistd.h>unsigned int alarm(unsigned int seconds) 返回值:0或以前设置的闹钟时间的余留秒数 ...原创 2019-04-19 15:14:18 · 236 阅读 · 0 评论 -
函数kill和函数raise(UNIX环境高级编程笔记)
kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号。#include <signal.h>int kill(pid_t pid, int signo)int raise(int signo) 返回值:若成功,返回0;出错则返回-1 调用raise(signo)相当于kill(getpid(), signo); kill函数...原创 2019-04-19 14:43:47 · 307 阅读 · 0 评论 -
消息队列(UNIX环境高级编程笔记)
消息队列是消息的链接表,存储在内核中,由消息队列标识符标识。 msgget用于创建一个新队列或打开一个现有队列。msgsnd将新消息添加到队列尾端。每个消息包含一个正的长整型的字段、一个非负的长度和实际数据字节数,所有这些都在消息添加到队列时,传送给msgsnd。msgrcv用于从队列中取消息。 每个队列都有一个msqid_ds结构与其相关联:struct msqid_ds { ...原创 2019-04-27 11:57:38 · 179 阅读 · 0 评论 -
共享存储(UNIX环境高级编程笔记)
共享存储允许两个或者多个进程共享一个给定的存储区。因为数据不需要在客户进程和服务器进程之间进行复制,所以这是最快的一种IPC。通常,使用信号量同步共享存储访问。 调用的第一个函数通常是shmget,它获得一个共享存储标识。#include <sys/shm.h>int shmget(key_t key, size_t size, int flag); ...原创 2019-04-27 15:36:50 · 347 阅读 · 0 评论 -
解释器文件、函数system、用户标识、进程调度、进程时间(UNIX环境高级编程笔记)
解释器文件 所有现今的UNIX系统都支持解释器文件(interpreter file)。这种文件是文本文件, 其起始行的形式是: #! pathname[optional-argument] 在感叹号和pathname之间的空格是可选的,最常见的解释器文件以下列行开始。 #! /bin/bash 内核执行的是解释器文件第一行的pathname所指定的文件,并不是解释器文件。函...原创 2019-04-18 14:37:48 · 107 阅读 · 0 评论