linux基础--linux编程基础

本文介绍了Linux中的管道通信机制及其实现方式,包括管道函数pipe的使用方法、管道命令的应用场景,以及如何利用管道实现父子进程间的通信。此外,还详细讲解了Linux中的进程概念、进程创建方式、进程的状态管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.
Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
· 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
· 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。

2.

pipe

Linux C 中的管道函数pipe
#include <unistd.h>
函数原型: int pipe(int fd[2])
返回值: 成功为 0 , 出错为 -1
管道只能用于有亲缘关系进程间的通信。要实现独立进程间的通信可参照有名管道(FIFO)。

3.

管道命令

用unix所谓的管道 可以把一个进程的标准输出流与另一个进程的标准输入流连接起来
unix中许多命令被设计为过滤器 从标准输入中读取输入 将输出传送到 标准输出
bash用“|” 在两个命令之间创建管道

管道C语言实现父子进程间通信

管道只能半双工通信,即某一时刻只能单向传输。要实现父子进程双方互动通信,需要定义两个管道。

2、sort命令

sort 命令在 Unix 中非常有用,它将文件中的各行按字母或数进行排序。sort命令既可以从特定的文件,也可以从stdin获取输入。

例如,对 foot 文件的各行进行排序:
  1. $sort food
  2. Afghani Cuisine
  3. Bangkok Wok
  4. Big Apple Deli
  5. Isle of Java
  6. Mandalay
  7. Sushi and Sashimi
  8. Sweet Tooth
  9. Tio Pepe's Peppers
  10. $
通过下面的选项可以控制排序规则:
选项描述
-n按照数字大小排序,例如,10会排在2后面;-n 选项会忽略空格或 tab缩进。
-r降序排序。sort 默认是升序排序。
-f不区分大小写。
+x对第x列(从0开始)进行排序。

下面的例子通过管道将 ls、grep 和 sort 命令连起来使用,过滤包含“Aug”的行,并按照文件大小排序:
  1. $ls -l | grep "Aug" | sort +4n
  2. -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros
  3. -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro
  4. -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07
  5. -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02
  6. $
上面的命令,对当前目录中八月份修改的文件按照大小排序;+4n 表示对第5列按照数字大小排序。

3、

more命令

一次只显示一屏文本,显示满后,停下来,并提示已显示全部内容的百分比,按空格键(space)可以查看下一屏,按 b 键可以查看上一屏。
4、

ftp 工具

ftp 是 File Transfer Protocol 的缩写,称为文件传输协议。通过 ftp 工具,能够将文件上传到远程服务器,也可以从远程服务器下载文件。

ftp 工具有自己的命令(类似Unix命令),可以:
  • 连接并登录远程主机;
  • 查看目录,遍历目录下的文件;
  • 上传或下载文件,包括文本文件、二进制文件等。

ftp 命令的用法如下:
  1. $ftp hostname or ip-address
接下来会提示你输入用户名和密码,验证成功后会进入主目录,然后就可以使用 ftp 工具的命令进行操作了。

ftp命令说明
put filename将本地文件上传到远程主机。
get filename将远程文件下载到本地。
mput file list将多个本地文件上传到远程主机。
mget file list将多个远程文件下载到本地。
prompt off关闭提示。默认情况下,使用 mput 或 mget 命令会不断提示你确认文件的上传或下载。
prompt on打开提示。
dir列出远程主机当前目录下的所有文件。
cd dirname改变远程主机目录。
lcd dirname改变本地目录。
quit退出登录。

注意,所有的上传和下载都是针对本地主机和远程主机的当前目录,如果你希望上传指定目录下的文件,首先要 cd 到该目录,然后才能上传。

5、

finger工具

finger 可以让我们查看本地主机或远程主机上的用户信息。有些系统为了安全会禁用 finger 命令。

6、进程

当我们运行程序时,Unix会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰。这个特殊的环境就称为进程。

理论上,五位数字是有限的,当数字被用完时,下一个 pid 就会重新开始,所以 pid 最终会重复。但是,两个 pid 一样的进程不能同时存在,因为Unix会使用 pid 来跟踪程序的运行状态。

7、

创建进程

有两种方式来创建进程:前台进程和后台进程。
前台进程
默认情况下,用户创建的进程都是前台进程;前台进程从键盘读取数据,并把处理结果输出到显示器。
后台进程
后台进程与键盘没有必然的关系。当然,后台进程也可能会等待键盘输入。

后台进程的优点是不必等待程序运行结束就可以输入其他命令。
还可以结合 -f 选项查看更多信息,f 是 full 的缩写,例如:
  1. $ps -f
  2. UID PID PPID C STIME TTY TIME CMD
  3. amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
  4. amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
  5. amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
  6. amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
每列的含义如下:
描述
UID进程所属用户的ID,即哪个用户创建了该进程。
PID进程ID。
PPID父进程ID,创建该进程的进程称为父进程。
CCPU使用率。
STIME进程被创建的时间。
TTY与进程有关的终端类型。
TIME进程所使用的CPU时间。
CMD创建该进程的命令。

ps 命令还有其他一些选项:
选项说明
-a显示所有用户的所有进程。
-x显示无终端的进程。
-u显示更多信息,类似于 -f 选项。
-e显示所有进程。

父进程和子进程

每个 Unix 进程会包含两个进程ID:当前进程ID(pid)和父进程ID(ppid)。可以暂时认为所有的进程都有父进程。

由用户运行的大部分命令都将 Shell 作为父进程,使用 ps -f 命令可以查看当前进程ID和父进程ID。

僵尸进程和孤儿进程

正常情况下,子进程被终止时会通过 SIGCHLD 信号通知父进程,父进程可以做一些清理工作或者重新启动一个新的进程。但在某些情况下,父进程会在子进程之前被终止,那么这些子进程就没有了“父亲”,被称为孤儿进程

init 进程会成为所有孤儿进程的父进程。init 的 pid 为1,是Unix系统的第一个进程,也是所有进程的父进程。

如果一个进程被终止了,但是使用 ps 命令仍然可以查看该进程,并且状态为 Z,那么这就是一个僵尸进程。僵尸进程虽然被终止了,但是仍然存在于进程列表中。一般僵尸进程很难杀掉,你可以先杀死他们的父进程,让他们变成孤儿进程,init 进程会自动清理僵尸进程。

常驻进程

常驻进程一般是系统级进程,以 root 权限运行在后台,可以处理其他进程的请求。

常驻进程没有终端,不能访问 /dev/tty 文件,如果使用 ps -ef 查看该进程,tty 这一列会显示问号(?)。

更确切地说,常驻进程通常运行在后台,等待指定事件发生,例如打印进程是一个常驻进程,它会等待用户输入打印相关的命令并进行处理。

top命令

top 命令是一个很有用的工具,它可以动态显示正在运行的进程,还可以按照指定条件对进程进行排序,与Windows的任务管理器类似。

top 命令可以显示进程的很多信息,包括物理内存、虚拟内存、CPU使用率、平均负载以及繁忙的进程等。

任务和进程

任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是多个进程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以由一个进程来实现,也可以由多个进程来实现。  每个任务都有一个数字表示的任务号。
  
进程(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。

jobs 命令可以用来查看系统中正在运行的任务,包括后台运行的任务。该命令可以显示任务号及其对应的进程ID。一个任务可以对应于一个或者多个进程号。

jobs 命令的 -l 选项可以查看当前任务包含的进程ID:
  1. $jobs -l
  2. [1] + 1903 running ls ch*.doc &
  3. $
其中,第一列表示任务号,第二列表示任务对应的进程ID,第三列表示任务的运行状态,第四列表示启动任务的命令。

台任务和后台任务的切换

fg 命令可以将后台任务调到前台,语法为:
  1. $fg %jobnumber
jobnumber 是通过 jobs 命令获取的后台任务的的序号,注意不是pid。如果后台只有一个任务,可以不指定 jobnumber。

bg 命令可以将后台暂停的任务,调到前台继续运行,语法为:
  1. $bg %jobnumber
jobnumber 同样是通过 jobs 命令获取的后台任务的的序号,注意不是pid。如果前台只有一个任务,可以不指定 jobnumber。

如果希望将当前任务转移到后台,可以先 Ctrl+z 暂停任务,再使用 bg 命令。任务转移到后台可以空出终端,继续输入其他命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值