实现pwd命令

本文参考Unix linux编程实践教程,完成编写pwd命令,并介绍相关核心知识点。

命令pwd用来显示到达当前目录的路径。例如:

root@ubuntu:~/uup/experiments# pwd

/root/uup/experiments

root@ubuntu:~/uup/experiments#

pwd命令的实现思路:

1.得到当前目录.的i节点号

2.然后改变当前目录为父目录

3.与查询出来的目录信息通过i节点号比较

4.重复此过程

由于在根目录. 和..的i节点号相同,因此递归终止的条件是到达根目录。

#include <stdio.h>......

僵尸进程与孤儿进程

最近忙里偷闲整理linux c系统编程中的相关知识点,今天来介绍的是僵尸进程与孤儿进程,并结合具体的代码示例,如果你有任何疑问欢迎留言讨论。如果你对这部分概念比较清楚,可以直接跳转到相关代码部分进行验证。

基本概念

孤儿进程:父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

产生的......

生产者消费者模型Linux C 实现

生产者消费者问题是同步问题中的一种常见情况,借用一下维基百科的话

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

信号量配合互斥锁实现

信号量:

信号......

一道fork面试题

原文链接一道fork面试题,本文对其内容进行组织优化,新增Unix高级环境编程中对此部分功能的讨论。如对文章内容有任何问题欢迎留言讨论。由于微信订阅号的限制,发布后不能再编辑,因此可以通过阅读原文来获取最新文章内容。如果文章内容存在错误,欢迎发送消息讨论。

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

int main(void)

{

int i;

for(i=0; i<2; i++){

fork();

printf("-");

}

wait(NU......

IO多路复用

I/O多路复用支持同时在多个文件描述符上阻塞,并在其中某个可以读写时收到通知。因此I/O多路复用成为应用的关键所在,在设计上遵循如下原则。

1.I/O多路复用:当任何一个文件描述符I/O就绪时进行通知

2.在有可用的文件描述符之前一直处于睡眠状态。

3.唤醒:哪个文件描述符可用了?

4.处理所有I/O就绪的文件描述符,没有阻塞。

5.返回第一步重新开始。

原版英文:

Multiplexed I/O allows an application to concurrently block on multiple file descriptors, and receive notifi......

三个特殊的位

针对几个特殊的位,前几天与同事一起讨论,整理相关内容如下,以备复习之用。

实际用户ID(RUID):用于标识一个系统中的用户,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid

有效用户ID(EUID):用于系统决定用户对系统资源的权限。也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限,如果有,则OK,否则报错不能执行。在正常情况下,一个用户登录之后(我们假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但是如果A用户在某些场景中想要执行一些特权操作,而上面我们说到用户的任何操作,LINUX内核都是通过检验有效用户ID来判断当前执行这个操......

close-on-exec标志解析

close-on-exec标志的作用是使得文件描述符自动关闭,如果fork子进程之后子进程要执行exec*(),如果不设置close-on-exec标志会导致文件描述符没有关闭。

实例:parent.c

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/types.h>

#include <sys/wait.h>

int main()......

[APUE]UNIX环境高级编程勘误表ver3

本文记录在阅读《UNIX环境高级编程》第三版过程中发现的错误,写这篇文章时阅读到第五章标准I/O库.

2014年6月第二版 2015年6月北京第4次印刷.

本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、......

实现cp命令

在看了《Linux/UNIX系统编程手册》和APUE前几章之后发现缺少相应的实践,如果只是单纯的了解API并没有太大意义,因此决定跟随《UNIX/Linux编程实践教程》将书中的例子调通与理解透。然后再去啃APUE,效果应该会好很多。

书中第二章给出了cp实现的,由于书写与2004年,代码看上去有些“另类”,对于编译过程中发现的问题进行修改。

/**************** copy command ******************/

/*

* cp命令的简单实现

* 实现思路:文件在磁盘上,源文件在左边,右边的是目标文件,进程在用户空间,缓冲区是进程内存的一部分,

* ......

实现who命令

在看了《Linux/UNIX系统编程手册》和APUE前几章之后发现缺少相应的实践,如果只是单纯的了解API并没有太大意义,因此决定跟随《UNIX/Linux编程实践教程》将书中的例子调通与理解透。然后再去啃APUE,效果应该会好很多。

书中第二章给出了who实现的,由于书写与2004年,代码看上去有些“另类”,对于编译过程中发现的问题进行修改,在讲解代码前先记录如下用法:

grep -r命令

-r, --recursive

Read all files under each directory, recursively, following symbolic links ......