自学Linux Shell5.1-深入理解shell父子关系

这些子进程可以是由Shell脚本直接启动的,让我们看一下如何在Shell脚本中启动一个新进程。表示当前正在执行此脚本文件的进程ID号”并且这个子进程将会从当前执行点开始执行。

在学习Linux Shell编程的过程中,我们经常会遇到父子进程的概念。Shell脚本是由Shell解释器来执行的,而Shell解释器本身也是一个进程。当我们在执行一个Shell脚本时,会产生若干个子进程。这些子进程可以是由Shell脚本直接启动的,也可以是由其他命令启动的。

那么,在这些父子关系中,它们之间到底存在着怎样的联系呢?又有哪些需要注意和掌握的技巧呢?下面我们将通过实例来深入理解shell父子关系。

首先,让我们看一下如何在Shell脚本中启动一个新进程。以下为示例代码:

“`

#!/bin/sh

echo “Before fork()”

echo “PID=$$”

fork()

if [ $? -eq 0 ]

then

echo “In child process”

echo “PID=$$”

else

echo “In parent process”

fi

在这段代码中,“$$”表示当前正在执行此脚本文件的进程ID号。

当运行以上代码后,在终端上输出结果为:

Before fork()

PID=1234

In parent process

In child process

PID=5678

自学Linux Shell5.1-深入理解shell父子关系

可以看出,在调用fork()函数之前,输出的信息只有一条。而在调用fork()函数之后,输出了两条信息。这是因为,在调用fork()函数时,会创建一个新的子进程,并且这个子进程将会从当前执行点开始执行。

同时,在父进程中也会返回一个值,可以通过$?来获取。如果返回值为0,则表示当前处于子进程中;反之则表示当前处于父进程中。

接下来,我们再看一下如何使用Shell脚本启动另一个命令,并获取它的PID号。

以下为示例代码:

echo “Before command”

command &

echo “After command”

在这段代码中,“&”符号表示启动该命令时不等待其执行结果即可返回终端提示符。

Before command

After command

[1] 12345

其中,“[1]”代表该命令是第一个被启动的后台任务;“12345”则是该任务所对应的PID号。

最后,我们再来看一下如何使用Shell脚本向正在执行的命令发送信号。以下为示例代码:

pid=$!

echo “PID=$pid”

sleep 5s

kill -9 $pid

在这段代码中,“$!”代表最近一次被启动的后台任务所对应的PID号。“-9”则代表强制杀死该任务。

PID=12345

可以看出,我们成功向正在执行的命令发送了信号,并将其杀死。

总结一下,Shell脚本中的父子进程关系是非常重要和常用的概念。掌握了这些技巧,可以让我们在编写Shell脚本时更加灵活、高效地运用系统资源。