首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关闭它们后重新打开stdout和stdin文件描述符

关闭stdout和stdin文件描述符是指将标准输出和标准输入文件描述符关闭,这样程序将无法向标准输出打印内容,也无法从标准输入读取内容。

关闭stdout和stdin文件描述符可以通过以下方式实现:

  1. 使用C语言的close函数关闭文件描述符。在Linux/Unix系统中,标准输出的文件描述符是1,标准输入的文件描述符是0。因此,可以使用以下代码关闭stdout和stdin文件描述符:
代码语言:c
复制
#include <unistd.h>

int main() {
    close(1); // 关闭stdout文件描述符
    close(0); // 关闭stdin文件描述符

    // 其他代码...
    return 0;
}
  1. 使用shell命令重定向关闭文件描述符。在命令行中,可以使用以下命令关闭stdout和stdin文件描述符:
代码语言:shell
复制
$ command > /dev/null 2>&1

上述命令将标准输出重定向到/dev/null(一个特殊的设备文件,丢弃所有写入它的内容),并将标准错误输出(2)也重定向到标准输出(1),从而关闭了stdout和stdin文件描述符。

重新打开stdout和stdin文件描述符可以通过以下方式实现:

  1. 使用C语言的dup2函数重新打开文件描述符。在Linux/Unix系统中,可以使用以下代码重新打开stdout和stdin文件描述符:
代码语言:c
复制
#include <unistd.h>
#include <fcntl.h>

int main() {
    int new_stdout = open("/dev/tty", O_WRONLY); // 重新打开stdout文件描述符
    int new_stdin = open("/dev/tty", O_RDONLY); // 重新打开stdin文件描述符

    dup2(new_stdout, 1); // 将new_stdout复制到文件描述符1(stdout)
    dup2(new_stdin, 0); // 将new_stdin复制到文件描述符0(stdin)

    // 其他代码...
    return 0;
}

上述代码中,使用open函数打开了一个特殊设备文件/dev/tty,该文件代表当前终端设备。然后使用dup2函数将新打开的文件描述符复制到stdout和stdin的文件描述符上,从而重新打开了stdout和stdin文件描述符。

  1. 使用shell命令重定向重新打开文件描述符。在命令行中,可以使用以下命令重新打开stdout和stdin文件描述符:
代码语言:shell
复制
$ command > /dev/tty 2>&1

上述命令将标准输出重定向到/dev/tty(当前终端设备),并将标准错误输出(2)也重定向到标准输出(1),从而重新打开了stdout和stdin文件描述符。

需要注意的是,关闭和重新打开stdout和stdin文件描述符可能会导致程序无法正常输出和读取内容,因此在实际开发中需要谨慎使用,并确保在适当的时候进行关闭和重新打开操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Linux命令行与shell脚本编程大全》第十五章 呈现数据

标准的文件描述符一样,一旦将另一个文件描述符分配给了一个文件,这个重定向就会一直有效,直到你重新分配。 例子:   1 #!...可以打开单个文件描述符作为输入输出。...  5 echo "Write: This is test line" >&3 15.4.5 关闭文件描述符 如果你创建了新的输入或输出文件描述符,shell会在脚本退出时自动关闭它们。...但是某些时候还是要自己去关闭。 如何关闭: 将要关闭文件描述符重定向到特殊符号 &- 一旦关闭,就不能在脚本中向他写入数据,否则shell会产生错误信息。 例子:   1 #!...列出打开文件描述符 lsof命令会列出整个linux系统打开的所有的文件描述符

1.3K60

Python 守护进程

[这一步是可选的](译者注:这里指步骤5,因为守护程序不一定需要写文件) 6. 调用‘close()’关闭文件描述符0,12。...如果你认为有可能有打开文件描     述符,你需要关闭它们,因为系统有一个同时打开文件数的限制。 7. 为标准输入,标准输出标准错误输出建立新的文件描述符。...即使你不打算     使用它们打开它们不失为一个好主意。...准确操作这些描述符是基于各自     爱好;比如说,如果你有一个日志文件,你可能希望把它作为标准输出标     准错误输出打开,而把‘/dev/null’作为标准输入打开;作为替代方法...(译者注:一     般使用dup2函数原子化关闭复制文件描述符

90630

Linux之基础IO

三、进程打开文件如何关联 通过文件打开(open)的返回值和文件描述符进行联系。...先看下面这个例子: 我们知道了,系统启动,默认会打开0,1,2这三个文件符对应的文件,如果我们将这三个中的其中一个关闭,然后去打开新的文件,这个新文件对应的fd会是多少呢?...此时,我们关闭了1,将fd = 1重新分配给文件log.txt,则要打印出来的内容就会写入文件log.txt。...比如:调用fwrite(stdout,…);无论底层的指向如何改变,上层都会用到stdin(标准输入),stdout(标准输出),stderr(标准错误)对应的文件描述符0,1,2.当我们将3号描述符对应的文件指针赋值给...2.接口 dup2: dup2的作用是在两个文件描述符之间进行拷贝(拷贝的不是文件描述符本身,而是它们文件描述符表中所对应的文件指针) dup2的参数中oldfdnewfd,dup2一旦重定向后

16730

【Linux】理解系统中一个被打开文件

其实在进程运行的时候,默认把标准输入(键盘:stdin)、标准输出(显示器:stdout)、标准错误(显示器:stderr) 打开了,它们分别代表 0、1、2;那么它们也是文件吗?...如果我们关闭 1号 fd,再重新打开一个文件,并把它的 fd 打印出来,我们会发现,什么都没有打印出来,这是为什么呢?很简单,因为我们把 1号 fd 关闭了,把标准输出关闭了! 七、重定向 1....重定向的原理 上面我们尝试过将 1号 fd 关闭重新打开一个文件,再打印数据,会发现什么都没有打印出来,但是我们将代码做一下修改,如下: int main() { close...} 结果如下图所示: 接下来我们尝试一下关闭0号 fd ,再打开 log.txt,从 stdin 中读取数据,即实现输入重定向,如下代码: int main() {...2. dup2 但是以上方式实现的重定向太麻烦了,每次都要关闭文件重新打开文件,有没有简洁一点的方式呢?

8510

Python守护进程daemon实现

这些环境包括未关闭文件描述符,控制终端,会话进程组,工作目录以及文件创建屏蔽字等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。...这些环境包括未关闭文件描述符、控制终端、会话进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。...这是为了保证守护进程的当前工作目录在一个挂载的文件系统中,该文件系统不能被卸载。 5、关闭不再需要的文件描述符。根据具体情况来定。...总结守护进程编程规则 1.在后台运行,调用fork ,然后使父进程exit 2.脱离控制终端,登录会话进程组,调用setsid()使进程成为会话组长 3.禁止进程重新打开控制终端 4.关闭打开文件描述符...se = open(stderr, 'a+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) #dup2函数原子化关闭复制文件描述符 os.dup2

7K30

Nginx(4):守护进程,一份nginx实现,一份我的实现,看着拿呗

创建步骤 1、创建“孤儿进程”,形式上与终端脱离; 2、让这个“孤儿进程”成为新会话的组长,防止进程被原会话中其他进程干扰; 3、改变工作目录并重设文件创建掩码; 4、关闭文件描述符,因为没必要开着了...*/ umask(0); /* 新产生的进程从父进程继承了某些打开文件描述符,如果不使用这些文件描述符,则需要关闭它们。...setsid(); // 4)禁止进程重新打开控制终端 /* 现在,进程已经成为无终端的会话组长,但它可以重新申请打开一个控制终端。...case 0: break; default: // 结束第一子进程,第二子进程继续(第二子进程不再是会话组长) exit(0); } // 5)关闭打开文件描述符...umask(0); // 8)重定向标准流 /* 新产生的进程从父进程继承了某些打开文件描述符,如果不使用这些文件描述符,则需要关闭它们

89520

Bash中文件描述符的详细介绍

简单地说,一个文件描述符可以一个文件挂钩,一旦挂钩就可以通过取地址运算符&获得该文件的句柄,比如&0就可以获得STDIN设备在内存中的句柄(设备在系统中也被当做文件处理),可以这样理解,如果是一个shell...默认标准文件描述符 每个进程启动时默认都会有三个标准的文件描述符: stdin 0 号描述符, 代表输入设备, 进程从它读入数据; stdout 1 号描述符, 进程往其中写入数据; stderr 2...当我们通过 exec 1 >&2 恢复 stdout , 可以发现文件 /tmp/stdout 里存储了之前命令的输出....&-, 此时表示关闭 Left 描述符, 例如 2<&- 表示关闭 stderr; Operation 可以为 ; 为 &1 1>&2 2>&3 3>&- 就可以交换 stdin stdout.

1.2K43

pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)

经过研究,上结论: os.popen 会打开一个管道执行命令,而管道是有输入(stdin)、输出(stdout) 的!...stdinstdoutstderr分别表示子程序的标准输入、标准输出标准错误。 可选的值有PIPE或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有None。...(仅限unix/linux) 如果把close_fds设置成True,unix/linux下会在开子进程前把除了0、1、2以外的文件描述符都先关闭。在 Windows下也不会继承其他文件描述符。...如果指定了startupinfocreationflags,它们将会被传递给后面的CreateProcess()函数,用于指定子程序的各种其他属性,比如主窗口样式或者是子进程的优先级等。..., stdin=subprocess.PIPE # 重定向输入值 ) proc.stdin.close() # 既然没有命令行窗口,那就关闭输入 proc.wait() result = proc.stdout.read

3.5K30

python中的daemon守护进程实现方法

它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。 守护进程的特性 1.在后台运行 2.与其运行前的环境隔离开来。...这些环境包括未关闭文件描述符、控制终端、会话进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。...守护进程编程规则 1.在后台运行,调用fork ,然后使父进程exit 2.脱离控制终端,登录会话进程组,调用setsid()使进程成为会话组长 3.禁止进程重新打开控制终端 4.关闭打开文件描述符...    verbose 表示将启动运行过程中的异常错误信息打印到终端,便于调试,建议非调试模式下关闭, 默认为1, 表示开启     save_path 表示守护进程pid文件的绝对路径    ...', umask=022, verbose=1):         self.stdin = stdin         self.stdout = stdout         self.stderr

73820

python 守护进程(daemon)

inetd完成了    所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()umask()了 ''' def daemon(stdin='/dev/null', stdout=...os.setsid()  # setsid调用成功,进程成为新的会话组长新的进程组长,并与原来的登录会话进程组脱离。       ...       for f in sys.stdout, sys.stderr: f.flush()     si = open(stdin, 'r')     so = open(stdout, 'a...+')     se = open(stderr, 'a+')     os.dup2(si.fileno(), sys.stdin.fileno())  # dup2函数原子化关闭复制文件描述符  ...4.修改umask 由于umask会屏蔽权限,所有设定为0,这样可以避免读写文件时碰到权限问题 5.fork孙子进程,子进程退出 经过上面几个步骤,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题

1K30

php的各种 IO流 以及用法

; STDIN常量是一个已经打开stdin流,可节省几行代码,也可节省小部分打开stdin的性能 当然,值得注意的点是: 1:php://stdin打开的其实是STDIN常量已经打开的复制,所以就算关闭了...php://stdin,也是关闭的复制,STDIN打开的不会被关闭 2:php://stdin是只读的 3:请直接使用STDIN常量,而不使用php://stdin 4:使用fgets读取,只能读取一行数据...例如 php://fd/3 引用了文件描述符 3。...用法: 在linux中,一切皆文件,当启动系统时,先会启动STDIN标准输入(文件描述符0),之后是STDOUT文件描述符1,STDERR文件描述符2 使用php://fd,可直接调用该文件: <?...两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制(默认是 2MB)存入临时文件中。

1.3K21

【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…

标准输入,标准输出,标准错误输出是系统默认打开的三个标准文件,系统自定义的三个文件指针stdinstdout、stderr中一定含有文件描述符。 3....通过文件描述符就可以找到对应的被打开文件。 操作系统通过这些内核数据结构,将被打开文件进程联系起来。...三、文件描述符的分配规则 1.关闭012文件描述符产生的现象(新打开文件的fd被赋值为0或1或2) 1....实际上文件描述符在分配时,会从文件描述符表中的指针数组中,从小到大按照顺序找最小的且没有被占用的fd来进行分配,自然而然关闭0时,0对应存储的地址就会由stdin改为新打开文件的地址,所以打印新的文件的...2.stderrstdout的区别 stdin — 标准输入文件 stdout — 标准输出文件 stderr — 标准错误输出文件 标准输入文件对应的终端是键盘,其余两个输出文件对应的终端是显示器

1.1K30

linux系统编程之文件与IO(一):文件打开关闭

一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h...int open(const char *path, int flags); 参数 path :文件的名称,可以包含(绝对相对)路径 flags:文件打开模式 返回值: 打开成功,返回文件描述符...(绝对相对)路径 flags:文件打开模式 mode:  用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限 返回值: 打开成功,返回文件描述符打开失败,返回-1 打开文件的方式...,如果文件不存在则建立文件 O_EXCL 如果已经置O_CREAT且文件存在,则强制open() 失败 O_TRUNC 在open() 时,将文件的内容清空 O_CLOEXEC 在进行exec进程替换时关闭打开文件描述符...S_IWOTH | S_IXOTH 为了重新利用文件描述符,用close()系统调用释放打开文件描述符  函数原型:int close(int fd); 函数参数: fd :要关闭文件文件描述符

1.7K90

Linux基础IO【重定向及缓冲区理解】

打开文件描述符为何是从 3 开始?...file* 指针,然后将这些指针存入指针数组中,可以进行高效的随机访问管理,这个数组为 file* fd_array[],而数组的下标就是神秘的 文件描述符 fd 当一个程序启动时,OS 会默认打开...标准输入、标准输出、标准错误 这三个文件流,将它们的 file* 指针依次存入 fd_array 数组中,显然,下标 0、1、2 分别就是它们文件描述符 fd;后续再打开文件流时,新的 file*...,优先使用当前最小的、未被占用的 fd 存在下面两种情况: 直接打开文件 file.txt,分配 fd 为 3 先关闭标准输入 stdin 中原文件执行流(键盘),再打开文件 file.txt,分配 fd...<< "先关闭1号文件执行流,再打开文件 fd: " << fd << endl; close(fd); return 0; } 注意: 假若将标准输出 stdout 中的原文件执行流

24130

研发:重新认识shell io 重定向

默认情况下始终有3个"文件"处于打开状态, stdin(键盘), stdout(屏幕), stderr(错误消息输出到屏幕上). 这3个文件其他打开文件都可以被重定向....对于重定向简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者是脚本中的代码块的输出, 然后将这些输出作为输入发送到另一个文件, 命令, 程序, 或脚本中....每个打开文件都会㹿分配一个文件描述符. stdin, stdout, stderr的文件描述符分别是0, 1, 2. 除了这3个文件, 对于其他那些需要打开文件, 保留了文件描述符3到9....在某些情况下, 将这些额外的文件描述符分配给stdin, stdout, 或stderr作为临时的剧本链接是非常有用的. 在经过复杂的重定向刷新之后需要把它们恢复成正常状态 ? ? ? ?

62830

《理解 Unix 进程》笔记-1

打开多个资源所分配的文件描述符编号是尚未使用的最小的数值。 资源一旦关闭,对应的文件描述符编号就会释放又能继续使用了。 文件描述符只是用来跟踪打开的资源,已经关闭的资源是没有文件描述符的。...标准流 每个 Unix 进程都有三个打开的资源,它们是标准输入(STDIN)、标准输出(STDOUT标准错误(STDERR)。...STDIN 提供了一种从键盘或管道中读取输入的通用方法 STDOUT STDERR 提供了一种向显示器、文件或打印机等输出写入内容的通用方法。...STDINSTDOUT、STDERR 也是文件 import sys print(sys.stdin.fileno()) print(sys.stdout.fileno()) print(sys.stderr.fileno...()) 输出: 0 1 2 进程皆有资源限制 文件描述符代表已打开的资源,当资源没有被关闭的时候,文件描述符编号会一直递增,那一个进程可以拥有多少个文件描述符呢?

86910

c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_

打开文件时,就建立了和文件的关系。   在开始执行程序的时候,将自动打开3个文件相关的流:标准输入流、标准输出流标准错误。流提供了文件程序的通信通道。...打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就是说,这个结构包含文件描述符文件描述符是操作系统数组(打开文件列表的索引)。...标准输入、标准输出标准错误是用文件指针stdinstdoutstderr来处理的。 ? 2....:%d\n",stdin->_file); printf("stdout:%d\n",stdout->_file); printf("stderr:%d\n",stderr->_...另外,还可以看出,程序运行的时候,默认三个流是打开stdinstdoutstderr,它们的_file描述符分别是0、12。也可以看出,该程序打开文件描述符依次从3开始递增。

97810

【Linux】 基础IO——文件(下)

,若文件不存在则重新创建一个 if(fd==-1)//说明打开失败 { printf("fd:%d,errno:%d,errstring:%s\n...重定向的本质 关闭文件描述符0,发现从0开始可以被输出了 ---- 关闭文件描述符02,发现02都可以被使用了 ---- 进程中,文件描述符的分配规则:在文件描述符表中,最小的,没有被使用的数组元素分配给新文件...输出重定向 若不关闭文件描述符1,当前printf打印的结果显示到显示器上面 ---- 关闭文件描述符1,再打开新的文件log.txt ---- 此时运行可执行程序没有显示出you can see...,这叫做输入重定向 追加重定向 关闭文件描述符1,导致printf不会打印在显示器上,而是追加到log.txt文件中 运行可执行程序,无显示,都追加到log.txt文件中 ---- 重定向函数...——dup2 输入 man dup2 查看 刚刚重定向时,需要先关闭文件描述符1,再打开文件 现在可以直接将文件打开,使用dup2重定向 输出重定向对应的文件描述符是1 打开myfile文件,假设其文件描述符

2.1K30
领券