Linux系统编程
文章平均质量分 82
Linux系统编程
请叫我阿渌
凡有所学,皆成性格。
展开
-
VIM常用快捷键(转)
VIM常用快捷键一、移动光标h,j,k,l 上,下,左,右ctrl-e 移动页面ctrl-f 上翻一页ctrl-b 下翻一页ctrl-u 上翻半页ctrl-d 下翻半页w 跳到下一个字首,按标点或单词分割W 跳到下一个字首,长跳,如end-of-line被认为是一个字e 跳到下一个字尾E 跳到下一个字尾,长跳b 跳到上一个字B 跳到上一个字,长跳0 跳至行首,不管有无缩进,就是跳到第0个字符^ 跳至行首的第一个字符$ 跳至行尾gg 跳至文首G 调至文尾5gg/5G 调至转载 2021-11-26 18:49:05 · 298 阅读 · 0 评论 -
Linux 回收子进程 wait/waitpid函数
wait/waitpid函数前提一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的 PCB 还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终 止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用 wait 或 waitpid 获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在 Shell 中用特殊变量$?查看,因为 Shell 是它的父进程,当它终止时 Shell 调用 wait 或 waitpid 得到它的退出状态同时彻原创 2020-08-25 10:03:13 · 362 阅读 · 0 评论 -
Linux中的exec函数族
exec函数族fork一个子进程执行exec函数族的函数(新的程序的数据会替换旧的程序的0-3G的用户区数据)execl、execlpint execl(const char*path, );参数path:要执行的可执行程序的路径;*arg:返回值只有失败才会返回 -1;...原创 2020-08-25 10:02:49 · 221 阅读 · 0 评论 -
Linux中的进程共享
进程共享Q1:fork()产生的父子进程有何异同?A1:fork()完成瞬间相同1、全局变量 2、.data 3、.text 4、栈 5、堆6、环境变量 7、用户 ID 8、宿主目录 9、进程工作目录10、信号处理方式…不同1、进程 ID 2、fork 返回值 3、父进程ID 4、进程运行时间5、闹钟(定时器) 6、未决信号集Q2:fork()完成时,子进程将父进程相同的内容直接copy了一份?A2:Of course not父子进程间遵循读时共享写时复制的原则(当然父原创 2020-08-25 10:02:22 · 386 阅读 · 0 评论 -
Linux 文件描述符重定向 dup2函数
dup2函数dup2描述重定向文件描述符(duplicate a file descriptor);实质:为一个文件额外指定一个文件描述符(可能已存在,可能不存在);头文件#include <unistd.h>函数签名int dup(int oldfd);int dup2(int oldfd, int newfd);参数oldfd:就是给oldfd指向的文件额外分配一个文件描述符;newfd:要指定给oldfd指向的文件的新文件描述符(可能存在,有可能不存在);原创 2020-08-25 10:01:56 · 271 阅读 · 0 评论 -
fork 循环创建多个子进程
循环创建多个子进程对于以下循环创建进程是什么样的呢?int i = 0;while(i < 3){ fork(); /*功能代码*/ i++;}子进程创建如下图学习笔记对于仅含有一个 fork()的循环体,循环n次后,共有2^n个进程(包含最初始的父进程);若fork()在循环体的开端,循环体的代码将被执行 (2^(n+1)-2) 次;事实上,我们一般只让父进程 fork,不让 子进程 继续fork,所以当 fork()返回值为0时,跳出循环,这样的话,循环n次,创建n个原创 2020-08-25 10:01:40 · 5178 阅读 · 1 评论 -
进程 相关系统函数
相关系统函数forkgetpid、getppid指令 psgetuid、geteuidgetgid、getegidfork描述创建一个子进程头文件#include <unistd.h>函数签名pid_t fork(void);返回值成功:在父进程中返回子进程的 pid (process id)(正整数);在子进程中返回0;失败:返回-1,并设置 error;学习笔记fork 函数没有参数;返回值:在总的说有两个,一个是在父进程,一个在子进程,原创 2020-08-25 10:01:20 · 134 阅读 · 0 评论 -
Linux 阻塞与非阻塞 读取文件
阻塞与非阻塞读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里。同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定。现在明确一下阻塞(Block)这个概念。当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该原创 2020-08-25 10:00:45 · 3507 阅读 · 0 评论 -
Linux 系统编程 fcntl函数
fcntl函数更改阻塞和非阻塞的属性fcntl头文件#include <unistd.h>#include <fcntl.h>函数签名 int fcntl(int fd, int cmd, ... /* arg */ );参数fd:int类型,文件描述符;cmd:表示可变参数;获取和设置文件属性F_GETFL:表示要通过 fcntl获取当前打开文件的文件属性,不需要额外参数;F_SETFL:表示用设置当前打开文件的文件属性,后面需要跟一个参数原创 2020-08-25 10:00:29 · 171 阅读 · 0 评论 -
Linux 系统编程 lseek函数
lseek函数lseek官方描述重新设置读写文件的偏移量(reposition read/write file offset);个人理解设置光标的位置,从哪个位置开始读取或写入数据;偏移量每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或原创 2020-08-25 10:00:15 · 438 阅读 · 0 评论 -
Linux 错误处理函数
错误处理函数errnostrerrorperrorerrno官方描述最后一个错误所对应的错误号(number of last error);头文件#include <error.h>使用引入头文件,就可以使用了,这是个全局变量;strerror官方描述返回描述错误号的字符串(return string describing error number);即对错误号的翻译;头文件#include <string.h>函数签名char *st原创 2020-08-25 10:00:02 · 559 阅读 · 0 评论 -
Linux 预读入缓输出
预读入缓输出Q1:如果一个只读一个字节实现文件拷贝,使用系统函数(read、write)效率高,还是使用对应的标库函数(fgetc、fputc)效率高呢?A1:库函数;对文件进行I/O操作,需要将数据从用户区-> 内核区 ->磁盘,从用户区到内核区需要切换 CPU的访问权级;系统函数:每次读取一个字节,切换权级,写入一个字节到内核区,大量时间浪费在切换访问权级上;库函数:有用户级缓冲区,ubuntu默认4096字节,当缓冲区满了之后,切换权级,写入内核;缓冲区:read、wr原创 2020-08-24 16:55:29 · 595 阅读 · 0 评论 -
Linux read/write函数
read/write函数read函数头文件#include <unistd.h>函数签名ssize_t read(int fd, void *buf, size_t count);参数fd:int类型,要读取的文件的文件描述符;*buf: void*类型,存放读取的字符;count:想要读取的字节总数;Return ValueOn success:返回读到的字节数(如果小于 count,说明提前到达了文件末尾);如果到达文件末尾,返回 0;On error:-1原创 2020-08-24 16:54:14 · 349 阅读 · 0 评论 -
Linux open/close函数
open/close函数查看函数man 2 openman 2 close简述打开文件可能创建并打开文件(open and possibly create a file)头文件前两个 unistd.h中包含#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>// 主要定义宏函数签名// 第一参数,文件路径;第二个参数,打开方式int open(const char *path原创 2020-08-24 16:52:09 · 7290 阅读 · 0 评论 -
Linux FILE结构体
FILE结构体struct file { … atomic_t f_count; //文件的引用计数(有多少进程打开该文件)unsigned int f_flags; //对应于open时指定的flagmode_t f_mode; //读写模式:open的mod_t mode参数off_t f_pos; //该文件在当前进程中的文件偏移量unsigned int f_uid, f_gid; //文件所有者id,所有组idconst struct file_operations *f_op原创 2020-08-24 16:50:27 · 537 阅读 · 0 评论 -
Linux 文件描述符fd(file descriptor)
文件描述符fd(file descriptor)百科解释: 内核(kernel)(操作系统最基本的部分)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。作用: 内核利用文件描述符来访问文件前提假设:每一个文件描述符会与一个打开文件相对应;不同的文件描述符可以指向同一个文件;相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开;同一进程,同一文件描述符不原创 2020-08-24 16:49:43 · 1596 阅读 · 0 评论 -
简述Linux系统调用
系统调用百科解释: 由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。简而言之:操作系统自带的API;C语言中 printf的调用系统函数:一个"hello world"如何打印到屏幕:用户区:用户操作;内核区:操作系统(实质也是一种软件)管理,涉及底层函数调用,需要在内核区运行;系统函数:对系统调用的封装;驱动程序:向上提供接口,向下驱动硬件;...原创 2020-08-24 16:49:04 · 242 阅读 · 0 评论 -
编写程序实现简单的cp功能
使用 Linux系统函数简单的实现[ cp ]指令的功能使用系统函数openreadwriteclose思路有一个文件 test.txt,复制之后的文件名为 test.cp;需要主函数传参,参数不够,关闭进程;打开文件;需要一个 buf,长度(BUF_SIZE,定义一个宏)随意,每次循环从 test.txt读取BUF_SIZE长度的内容,写入到 test.cp;打开、读取、写入一旦异常(返回值为 -1),关闭进程;关闭文件;mycp.c代码#include <stdi原创 2020-07-23 11:03:29 · 1728 阅读 · 0 评论