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

WindowsAPI 之 CreatePipe、CreateProcess

大家好,又见面了,我是你们的朋友全栈君。...在Windows编程中,重定向需要用到管道(Pipe)的概念。管道是一种用于在进程间共享数据的机制。一个管道类似于一个管子的两端,一端是写入的,一端是读出的。...重定向的原理是: 首先声明两个概念:主程序(重定向的操纵者)、子进程(被重定向的子进程) 如果要重定位stdout的话,先生成一个管道, 管道的写入端交给子进程去写,主程序从管道的读出端读数据,然后可以把数据写成文件...重定向stderr和stdout是相同的。 同理,要重定向stdin的话,生成一个管道, 管道的写入端由主程序写,子进程从管道的读出端读数据。...在生成子进程之前,父进程首先调用Win32 API SetStdHandle()使子进程、父进程可共用标准输入、标准输出和标准错误句柄(StdOut、StdIn、StdErr)。

4.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】基础IO认识(2)

    stdout的话(加上fflush),此时展现的结果就是会创建一个文件,并且在文件中有着我们原本需要打印的内容,那这不就是换一种意义上的重定向的含义吗。...代码如图 其中C语言中的这两个函数其实指向本质应该是这样:fprintf/printf->stdout->struct FILE->stdout->_fileno==1。...这么看的话,重定向是不是有点粗糙,每次的重定向都还需要关闭文件,然后再打开才能够实现重定向吗? 当然不是了!介绍系统调用接口dup2。...当然哪一个是old哪一个是new就需要看函数解释( 我就简单的搜一下这个调用的介绍,想要更深入的了解到话,还是自行搜搜吧) 看完函数解释知道newfd是oldfd的拷贝,所以要重定向的话,最后留下来的是...实现库的封装实际上是挺难的,所以为了防止这么多了的情况下,还要讲不少的内容。所以期待下一篇吧!

    9210

    Swoole的多进程模块

    大家好,又见面了,我是全栈君。...$function,子进程创建成功后要执行的函数,底层会自动将函数保存到对象的callback属性上。如果希望更改执行的函数,可赋值新的函数到对象的callback属性 2....$redirect_stdin_stdout,重定向子进程的标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。...3.create_pipe,是否创建管道,启用redirect_stdin_stdout后,此选项将忽略用户参数,强制为true。如果子进程内没有进程间通信,可以设置为 false。...for ($i = 0; $i 个子进程 $process = new Swoole\Process(function ($process) {

    1.1K20

    【Linux】开始了解重定向

    – 史铁生 《我与地坛》 开始了解重定向 1 前言 2 重定向与缓冲区 2.1 文件描述符分配规则 2.2 重定向的现象 2.3 重定向的理解 2.4 缓冲区的理解 3 进程与重定向 Thanks♪...那么加入我们关闭012中的文件呢,那么新打开的文件描述符会是3吗???...那为什么会拷贝两次呢???为什么会有两个缓冲区, **因为系统调用是有成本的!...3 进程与重定向 我们再来与先前的进程控制结合一下,来看: 1 #include 2 #include 3 #include进程会拷贝一份数据也就语言层的缓冲区被打印了两次,内核缓冲区不会拷贝给子进程(不是用户级,所有用户共享) 缓冲区就在struct file 内部!每个文件都有自己的缓冲区。

    10510

    Swoole的多进程模块

    $function,子进程创建成功后要执行的函数,底层会自动将函数保存到对象的callback属性上。如果希望更改执行的函数,可赋值新的函数到对象的callback属性 2....$redirect_stdin_stdout,重定向子进程的标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。...3.create_pipe,是否创建管道,启用redirect_stdin_stdout后,此选项将忽略用户参数,强制为true。如果子进程内没有进程间通信,可以设置为 false。...for ($i = 0; $i 个子进程 $process = new Swoole\Process(function ($process) {...swoole_process::IPC_NOWAIT);//启用消息队列,争抢模式,非阻塞,可能会被任意一个子进程接收到 $pid = $process->start(); $process

    78830

    Supervisor快速入门 | 使用Supervisor守护Nginx进程

    supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。...我这里就叫做nginx了!...daemon off;' # 需要执行的命令 directory=/etc/nginx # 命令执行的目录或者说执行 command 之前,先切换到工作目录 可以理解为在执行命令前会切换到这个目录 在我这基本没啥用...autostart=true #是否自动启动 autorestart=true #程序意外退出是否自动重启 redirect_stderr=true # 如果为true,则stderr的日志会被写入stdout...日志文件中 理解为重定向输出的日志 priority=10 # 启动优先级 stdout_logfile=/data/logs/supervisord/nginx.log # 子进程的stdout的日志路径

    12.4K30

    Supervisor使用详解

    supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。...=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups...= 20 ; stdout 日志文件备份数,默认是10 ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件) stdout_logfile...=/tmp/blog_stdout.log #把stderr重定向到stdout,默认 false redirect_stderr = true #stdout日志文件大小,默认 50MB stdout_logfile_maxbytes...= 20M #stdout日志文件备份数 stdout_logfile_backups = 20 子进程配置示例: #说明同上 [program:test] directory=/opt/bin

    74620

    初识Linux · 重定向和缓冲区

    那么这个现象奇怪吗?其实并不算奇怪,因为我们知道文件描述符1虽然被关闭了,但是实际上只是没给stdout而已,给了新开的文件log.txt,那么,这是不是一种重定向呢? 答案:是!...,"fprintf,fd:%d\n",fd); fflush(stdout); close(fd); return 0; } 结果居然是打印出来了,难道是因为我们没有把缓冲区刷新干净吗...那么我们现在已经理解了重定向,再加深一点印象,我们介绍一下,dup2这个函数: 对于dup2函数来说,参数只有两个,oldfd,newfd,那么,当我们改变文件描述符,比如上面的1从stdout给到了log.txt...而创建进程之后,进程结束之后是会刷新缓冲区的,也就是将语言层面的刷新了两次,从而导致,log.txt里面,有两份一样的代码。 所以,我们从这个现象,引出三段论: 缓冲区是什么? 缓冲区为什么存在?...缓冲区是一块空间,但是本质上,缓冲区实际上是结构体,为什么我这么说呢?

    12810

    UNIX哲学及其实现

    系统中共有3个标准输入输出 $ ls -la /dev/std* /dev/stderr -> /proc/self/fd/2 /dev/stdin -> /proc/self/fd/0 /dev/stdout...-> /proc/self/fd/1 stderr 代表标准错误输出 代码为2,默认设备是屏幕 stdin 代表标准输入 代码为0,默认设备是键盘 stdout 代表标准输出 代码为1,默认设备是屏幕...,而是输出到某个文件中,这个操作就是‘重定向’ $ find a 2> err.txt 这个命令就把错误信息写入‘err.txt’文件中 其中 2 代表stderr,> 代表重定向,意思就是把标准错误数据流重定向到后面指定的文件中...> 会覆盖后面文件中的内容 >> 是向后面文件中追加内容 3 管道 例如一个常用的命令:查看某进程的信息 # ps -aux | grep httpd 这就是管道的用法,形式如下 ?...(1)管道是对应命令的,而重定向是对应文件 (2)管道触发两个子进程执行"|"两边的程序,而重定向是在一个进程内执行

    71850

    Linux基础IO【II】真的很详细

    我想到了数组的下标。也许这和数组有这千丝万缕的关系,但我们都只是猜测,接下来就证明我们的猜测。 首先我们可以利用现在掌握的知识推导出这样一条逻辑链: 进程可以打开多个文件吗?...文件描述符1(STDOUT_FILENO):它是标准输出文件描述符,通常与进程的标准输出流(stdout)相关联。它用于向终端或控制台输出数据,例如程序的正常输出、结果和信息。...有两种情况不符合刷新策略的规定 用户强制刷新,比如fflush(stdout)。 进程退出,一般都要刷新缓冲区。 4.缓冲区的位置 缓冲区在哪?指的是什么缓冲区?...没有进行重定向。stdout默认使用的是行刷新,在进程调用fork()之前,三条C语言函数打印的信息已经显示到了显示器上(外设)。FILE内部的缓冲区不存在对应的数据了。...执行fork时,stdout属于父进程。创建子进程时,紧接着就是进程退出,谁先退出,就要先进行缓冲区刷新(也就是修改数据,发生写时拷贝)。父子进程在退出时都会刷新一次缓冲区,所以就会打印两次。

    9310

    写一个自己的命令行解释器

    写一个自己的命令行解释器 当我点开xshell运行服务器的时候bash就被加载到了内存中,此后我在bash上执行的所有程序都是作为bash的子进程。...在bash这个进程内创建子进程,并让子进程去执行全新的代码,这不就是程序替换吗? 所以我们让子进程去执行程序替换,在我们的程序内执行命令,那我们不就是写了一个自己的命令行解释器吗?...查询上次指令的退出码:要拿到上次的退出码我首先要保存上次的退出码,所以还要定义两个变量,此外还要通过枚举让 ?变成输出上次的退出码而不是向屏幕中打印 ?...追加重定向本质上也是另外一种输出重定向,所以可以将这两个放在一起写,具体实现如下: #include #include #include #include...printf("用户名@服务器 当前路径:"); fflush(stdout); //将用户输入的指令作为字符串存入数组中,用fgets函数获取输入的指令 我要将其切割出来

    1.2K10

    Linux 后台运行python .sh等程序,以及查看和关闭后台运行程序操作

    (1)&命令 功能:加在一个命令的最后,可以把这个命令放在后台执行 (2)nohup命令 功能:不挂断的运行命令 2、查看当前后台运行的命令 有两个命令可以用,jobs和ps,区别是...(1)jobs命令 功能:查看当前终端后台运行的任务 jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated...)重定向到 那个文件,这里重定向到了python.log 2、 & 表示在后台执行脚本 这样可以到达目的,但是,我们退出shell窗口的时候,必须用exit命令来退出,否则,退出之后,该进程也会随着...,这里&1表示标准输出 , 为什么需要将标准错误重定向到标准输出的原因,是因为标准错误没有缓冲区,而STDOUT有。...这就会导致 commond > python.log ,2> python.log 文件python.log被两次打开,而STDOUT和 STDERR将会竞争覆盖,这肯定不是我门想要的 3、好了

    11.6K21

    管道与重定向、文件查找-Linux每日一练(7)

    上次我们着重讲解了进程管理的知识,这一节提一下管道、重定向、文件查找。 重定向 在解答上次的重定向问题之前,简单提一下什么是重定向。...Unix 系统中,每个进程都有 STDIN 、 STDOUT 和 STDERR 这 3 种标准 I/O 。...标准输出文件(stdout):stdout 的文件描述符为 1,Unix 程序默认向 stdout 输出数据。...比如有些人可能会这么想:2 是标准错误输入, 1 是标准输出, > 是重定向符号,那么"将标准错误输出重定向到标准输出"是不是就应该写成 2>1 就行了?是这样吗?...,在程序里处理信号做一些析构的工作(当然,我知道大家的程序基本上都懒得写这些) 也推荐用 systemctl 、 supervisor 、容器等守护进程托管你的程序,比较安全可靠。

    1.2K31

    UNIX高级环境编程 第三次实验 实现带参数的简单Shell

    argv:参数表,比如ls命令中可带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。 envp:环境变量表,供要执行的命令使用。...一般命令都可以由fork+execvp执行,由fork创建一个子进程,调用一种exec函数时,该进程执行的程序完全替换为新程序 而新程序则从其main函数开始执行; 但要注意exec并不创建新进程,所以前后的进程...,pid=0表示在子进程中,若有重定向输入输出,则在redirect_stdin或 redirect_stdout中处理,execvp填入可执行文件参数,子进程开始执行,若出错才会执行下面的execvp...在执行其他命令时,调用了自己写的redirect_stdin和redirect_stdout两个函数。...这两个函数通过open命令,将之前获取的rfile 和wfile文件打开,获取File descriptor后,再使用dup2函数重定向STDIN_FILENO和STDOUT_FILENO,open函数采用权限位为

    96220

    【Linux系统IO】二、文件描述符与重定向

    还记得我们之前调用 open() 接口的时候返回值叫做什么 文件描述符(file descripter) 吗,虽然我们还没有学习它,但是因为我们每次去调用 write() 和 read() 甚至是 close...这个接口的参数填写的时候经常会搞错,下面举个例子来加以解释两个参数: ​ 就以我们上面那串代码为例,我们要输出重定向到 log.txt ,所以我们要覆盖的就是 stdout ,也就是说这里的 newfd...= -1); if(id == 0) { // 因为命令是子进程执行的,真正重定向的工作一定是子进程来完成的 // 如何重定向...,是父进程要给子进程提供信息的 // 又因为进程独立性,子进程重定向后其files_struct是不会影响父进程的 // 并且因为被打开文件是共享的,所以就能达到子进程重定向...所以 程序替换是不影响内核数据结构的,即不影响曾经进程打开的重定向文件!

    6510

    自带的 print 函数居然会报错?

    根据官方文档的解释,该函数会执行 fork 一个子进程执行 command 这个命令,同时将子进程的标准输出通过管道连接到父进程; 也就该方法返回的文件描述符。...如果不需要子进程中的输出时,也可以将 command 的标准输出重定向到 /dev/null。 也可以使用 Python3 的 subprocess.Popen 模块来运行。...比如这次提到的 Python 中的 os.popen() 就是创建了一个子进程,既然是子进程那肯定是需要和父进程进行通信才能达到协同工作的目的。...还是以刚才的 Python 程序为例,当运行 task.py 后会生成两个进程: 分别进入这两个程序的/proc/pid/fd 目录可以看到这两个进程所打开的文件描述符。...这里的 0 1 2 分别对应一个进程的stdin(标准输入)/stdout(标准输出)/stderr(标准错误)。

    70310

    基础IO的理解与操作 - fd

    比如,我当前写了一个程序,现在正在被运行,我们可以利用命令:ls /proc/pid -l 来查看此进程的相关属性:          如上图所示,其中进程属性cwd为当前工作目录,exe为此程序路径...2.fd和再次理解一切皆文件 进程与文件描述符指向内容          明白了上述接口后,fd究竟是什么东西呢?一个int类型,竟然能够指向一个文件吗?        ...还记得一开始讲C接口的时候提到的默认打开三个文件吗?stdin,stdout,stderr。是的,因为编译器默认打开这三个位置,所以fd从0开始,012这三个位置就被这三个文件所占。        ...重定向&追加重定向引入         那么我们这里能否改变一下呢,如果我们提前关闭了默认打开的文件呢?比如关闭显示器stdout这个文件,在执行printf会发生什么后果呢?...\n");fflush(stdout);close(fd);}         但是真正的重定向可不是这样的哦,上面只是为我们展示了重定向的原理,下面才是重定向的重头戏呢。

    79020

    Supervisor的简单使用

    supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。...Supervisor4大组件 supervisord 主进程,负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等...该配置文件输出单个日志文件的大小,默认50M logfile_maxbytes=50MB # 日志备份个数 logfile_backups=10 # 记录日志级别 loglevel=info # 指定标准输出日志文件 stdout_logfile...core50test.out.log # 环境变量 environment=ASPNETCORE_ENVIRONMENT=Production # 启动服务的用户 user=root # 把stderr重定向到...stdout,默认 false redirect_stderr=true 注意:stdout_logfile指向的文件夹一定要先创建,否则无法启动,上述配置文件中的内容需要根据用户实际情况修改,如我当前登录的用户是

    29610
    领券