首页 > 编程知识 正文

linux查看文件描述符,cmd中javac不是内部或外部命令

时间:2023-05-05 05:18:15 阅读:170663 作者:4913

虽然看了几篇文章,对exec进行了说明,但都是一知半解,所以我尽量说得清楚。 本文首先介绍了Linux文件描述符,然后是exec,最后通过示例说明了exec I/O重定向及其使用方法。

1 Linux文件描述符简介

在Linux系统中,所有文件都被视为文件,文件分为普通文件、目录文件、链接文件和设备文件。 文件描述符(file descriptor )是为有效管理内核打开的文件而创建的索引。 这是一个指向打开文件的非负整数(通常为小整数),执行I/O操作的所有系统调用都通过文件描述符。 前三个文件描述符(0,1,2 )分别支持标准输入(stdin )、标准输出(stdout )和标准错误)。 因此,函数scanf (使用stdin,函数printf )使用stdout。 可以用不同的文件描述符复盖缺省设置,并将进程I/O重定向到不同的文件。 Unix操作系统通常对每个进程可以打开的文件数量施加限制。

例如,要将标准输出(1)和标准错误)重定向到一个文件,请使用以下命令

xx命令21文件名称

要显示LINUX上的默认文件描述符数,请:

# ulimit -n1024

使用以下命令增加文件描述符数:

ulimit -HSn 65536

2 exec原理介绍

exec和source都属于bash内部命令(builtins commands )。

source:source命令是点(.)命令。

在bash下输入man source,找到source命令的说明,说明为" readandexecutecommandsfromfilenameinthecurrentshellenvironmentand…" 这表明,source命令用于在当前进程中执行参数文件中的各个命令,而不是单独的驱动程序进程(或sub-shell )。

exec:

在bash下输入man exec,找到exec命令的解释位置时,将看到“No new process is created .”的解释。 这意味着exec命令不会生成新的子进程。 那么exec和source的区别是什么呢? exec命令在运行时关闭当前的shell进程,然后切换到后续命令并继续执行。

系统调用exec将使用新进程替换原始进程,但不会更改进程的PID。 因此,exec系统调用没有制作新的流程,只是置换了原来的流程上下文的内容。 原始流程中的代码段、数据段和堆栈段将被新流程替换。

一个过程主要包括以下领域的内容:

(1)可执行的程序

)2)所有与进程相关的数据)包括变量、内存和缓冲区)。

)3)程序上下文(程序计数器PC,保存程序的执行位置) ) )。

解释exec命令的最恰当的说法是践踏了你现在的外壳。

该脚本结束后,相应的会话可能也会结束。

但是,exec在操作文件描述符时(仅限于此时),不会覆盖你当前的shell。

3执行I/o重定向的基本概念和应用实例

3.1基本概念(请把意思看一遍,看后面的例子后再参考) )。

1常用软盘(文件描述符)有0(stdin,标准输入)、1 )1(stdout,标准输出)、2 )2(stderr,标准错误输出)三种,但也可以指定其他数字作为文件描述符。

2运行2bash(ksh )命令的过程(分析命令-变量评估-命令替代(`和$ ) ) ) -重定向-通配符展开-确定路径-运行命令

3 -关闭标准输出

4 n-表示关闭号输出

5 filename表示要读取文件filename

6 filename表示对文件filename的写入

7以读写方式打开文件文件文件文件名称

3.2应用实例

1、用exec分配文件描述符

#! /strong朋友/shexec3hello.txt #通过读写绑定到文件描述符'3'

echo 'hello exec' 3 #将被写入' hello exec '。 如果以前有内容,这里会从文件的开头被复盖。 echo 'hello world' 3 #将写入' hello world ',新行。

关闭exec 3-#写入,禁止写入。 但是,实际上看不懂~

exec3的情况

打开文件时,将出现以下结果

[ [ email protected ] tmp ] # cat hello.txt

hello exec #第一次插入的是第一行

hello world #第二次在新行

errfilename #下的是旧数据,还保留着

hello.txt

>systemd-private-CEGg3c

test

2、将标准输出重定向到hello.txt

#!/坚强的朋友/shexec1>hello.txt # 将标准输出重定向到文件hello.txt,从此以后,当前环境(shell)中的的标准输出都将被写入文件hello.txtecho "hello exec"

echo "hello world"

这样,在终端再也见不着标准输出了,因为所有标准输出到放大文件hello.txt中了

如果你现在运行who am i命令,终端什么都不显示,打开另外一个终端

可以发现hello.txt文件的内容如下

[[email protected] tmp]# cathello.txt

hello exec

hello world

root pts/1 2016-03-18 23:27 (192.168.233.1) #这是who am i命令的输出,已经重定向到该文件中了

3、在上面这个示例中,标准输出被重定向了,如果要恢复怎么办?

#!/坚强的朋友/shexec100>&1 # 将文件描述符100连接到标准输出,此时100 和1同时指向hello.txt,即echo "hello exec" >&100 和echo "hello exec"的效果一样,都写入hello.txt

# 由于之后还要输出到终端,所以我们不得不使用一个临时的描述符来保存它!

exec1>hello.txt # 首先清空hello.txt,并再次将标准输出重定向到文件hello.txt,从此以后,这个环境中的标准输出都将被写入文件hello.txtecho "hello exec"exec1>&100 100>&-# 将标准输出连接到100,这是之前保存的标准输出

# 将描述符100关了,一了百了,因为已经还原标准输出了,留着它实在没必要echo "oh, my god!" # 从这句开始将显示在终端上

4、标准输入的操作与2、3相似,只是使用的是"

注意,下面这个必须存到脚本里面执行,不然总是会退出登录

#!/坚强的朋友/shexec100

read line1echo$line1

exec0&-# 将标准输入连接到100

# 将描述符100关了,一了百了,因为已经还原标准输入了,留着它实在没必要

read-p "please input:"custome #测试不是文件的标准输入echo "your input is :$custome"

参考

原文:http://www.cnblogs.com/lizhaoxian/p/5294158.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。