Linux学习笔记

88次阅读

共计 571 个字符,预计需要花费 2 分钟才能阅读完成。

linux 的基本命令

1. 切换目录 cd

cd keller 切换到 keller 目录
cd .. 切换到上一层目录
cd / 切换到系统根目录
cd ~ 切换到用户主目录
cd - 切换到上一个命令所在的目录 

2. 查看文件列表 ls

ls -l 查询文件列表友好显示
ls -a 查询该目录下的所有文件,包括隐藏文件 

3. 创建目录及移除目录 mkdir/rmdir

mkdir keller 在当前目录下创建 keller 目录
mkdir -p 目录 如果目录不存在就创建一个
rmdir app 删除当前目录下的 app 目录 

4. 浏览文件 cat

cat keller.xml 查看当前目录下的 keller.xml 的内容
cat keller.xml | more 查看当前目录下的 keller.xml 的内容,分页显示
tail -10 keller.xml 浏览 keller.xml 文件的后十行内容 

5. 文件创建及删除 touch/rm

touch keller.txt 在当前目录下创建一个 keller.txt 文件
rm keller.txt 删除当前目录下的 keller.txt,会要求确认
rm -f k.txt 直接删除 k.txt 文件,不询问
rm -rf k.txt 不询问,递归删除
cp a.txt b.txt 将 a.txt 复制为 b.txt

6. 打包或解压 tar

tar -cvf keller.tar *.log 将后缀为.log 的文件打包成一个 keller.tar 放在当前目录下 

正文完
 0

linux-学习笔记

88次阅读

共计 1394 个字符,预计需要花费 4 分钟才能阅读完成。

进程学习笔记

转自 https://www.cnblogs.com/jackl…

  • 进程控制块(PCB)

============

在 Linux 中 task_struct 结构体即是 PCB。PCB 是进程的唯一标识,PCB 由链表实现(为了动态插入和删除)。
进程创建时,为该进程生成一个 PCB;进程终止时,回收 PCB。
PCB 包含信息:1、进程状态(state);2、进程标识信息(uid、gid);3、定时器(time);4、用户可见寄存器、控制状态寄存器、栈指针等(tss)
每个进程都有一个非负的唯一进程 ID(PID)。虽然是唯一的,但是 PID 可以重用,当一个进程终止后,其他进程就可以使用它的 PID 了。
PID 为 0 的进程为调度进程,该进程是内核的一部分,也称为系统进程;PID 为 1 的进程为 init 进程,它是一个普通的用户进程,但是以超级用户特权运行;PID 为 2 的进程是页守护进程,负责支持虚拟存储系统的分页操作。除了 PID,每个进程还有一些其他的标识符:

#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
/* Return the session ID of the given process.  */
extern __pid_t getsid (__pid_t __pid) __THROW;
#endif

/* Get the real user ID of the calling process.  */
extern __uid_t getuid (void) __THROW;

/* Get the effective user ID of the calling process.  */
extern __uid_t geteuid (void) __THROW;

/* Get the real group ID of the calling process.  */
extern __gid_t getgid (void) __THROW;

/* Get the effective group ID of the calling process.  */
extern __gid_t getegid (void) __THROW;

五种进程之间转换关系如图:

每个进程的 task_struct 和系统空间堆栈存放位置如下:两个连续的物理页【《Linux 内核源代码情景分析》271 页】


系统堆栈空间不能动态扩展,在设计内核、驱动程序时要避免函数嵌套太深,同时不宜使用太大太多的局部变量,因为局部变量都是存在堆栈中的。

进程的创建

新进程的创建,首先在内存中为新进程创建一个 task_struct 结构,然后将父进程的 task_struct 内容复制其中,再修改部分数据。分配新的内核堆栈、新的 PID、再将 task_struct 这个 node 添加到链表中。所谓创建,实际上是“复制”。

子进程刚开始,内核并没有为它分配物理内存,而是以只读的方式共享父进程内存,只有当子进程写时,才复制。即“copy-on-write”。
fork 都是由 do_fork 实现的,do_fork 的简化流程如下图:

fork 函数

#include<unistd.h>
pid_t fork(void)    // 子进程返回 0,父进程返回子进程 ID,出错返回 -1.

fork 函数时调用一次,返回两次。在父进程和子进程中各调用一次。子进程中返回值为 0,父进程中返回值为子进程的 PID。程序员可以根据返回值的不同让父进程和子进程执行不同的代码。
一个形象的过程:

正文完
 0