Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >Fd[0]之后的dup2!= STDIN_FILENO

Fd[0]之后的dup2!= STDIN_FILENO
EN

Stack Overflow用户
提问于 2013-03-28 08:43:09
回答 4查看 3.6K关注 0票数 0

有没有人可以在检查fd[0] != STDIN_FILENO之后解释一下使用dup2的原因,因为据我所知,fd[0] != STDIN_FILENO会失败,dup2仍然会返回STDIN_FILENO以外的东西,只是试着理解一些示例代码谢谢,而且如果有人能为我解释一下execlp的用法,那就太棒了。

代码语言:javascript
代码运行次数:0
复制
int fd[2];
pid_t pid;

if(argc != 2) {
        fprintf(stderr, "Must be specify exactly 1 file\n");
        exit(0);
    }

    if(pipe(fd) < 0)
        exit(1);./ 

    pid = fork();

    switch (pid) {
        case -1:
            exit(1);
        case 0:
            close(fd[1]);
                        //here
            if(fd[0] != STDIN_FILENO) {
                if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
                    exit(3);
                close(fd[0]);
            }
            if(execlp("tr", "tr", "[a-z]", "[A-Z]", (char *) 0) < 0)
                exit(4);
            break;

        default:
            close(fd[0]);
                        // and here
            if(fd[1] != STDIN_FILENO) {
                if(dup2(fd[1], STDIN_FILENO) != STDIN_FILENO)
                    exit(5);
                close(fd[1]);
            }
            if(execlp("cat", "cat", argv[1], (char *) 0) < 0)
                exit(4);
            break;
    }
    return 0;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-28 09:06:57

这样做的目的是让stdin (STDIN_FILENO,它是0)指向fd指向的文件(管道的读取端)。首先检查它们是否已经不同...如果是,代码将dup 0到0,然后关闭0 --这不是很好。如果它们不相同,则使用dup2将fd指向的位置设置为STDIN_FILENO。如果dup2成功,它将返回它的第二个参数,因此如果dup2失败,则通过调用exit来进行检查。

你写

据我所知,

fd != STDIN_FILENO将失败

完全不清楚为什么你会“理解”这一点。只有当fd包含STDIN_FILENO (即0)时它才会失败,但它不太可能失败,因为它包含由pipe调用分配的文件描述符。

dup2仍然会返回STDIN_FILENO以外的内容

如果成功,dup2将返回它的第二个参数。除非失败,否则它不会返回STDIN_FILENO以外的任何东西--为什么它会返回?--在这种情况下,它返回-1。

票数 3
EN

Stack Overflow用户

发布于 2013-03-28 08:58:57

execlp基本上是执行一个程序。该程序将从STDIN_FILENO (换句话说,fd0)读取其输入。dup2close系统调用用于将fd[0]fd[1]文件描述符移到该数字。

票数 1
EN

Stack Overflow用户

发布于 2013-03-28 09:23:04

fd[0] != STDIN_FILENO的检查是一种防御性编程实践,因为通常情况下,标准输入和标准输出以前都是打开的,尽管如果它们在您调用pipe()之前都已关闭,pipe()会将这两个描述符分配给管道(请注意,在创建管道时,用于管道两端的文件描述符是编号最小的下一个描述符),因此检查将变得有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15677403

复制
相关文章
用指针的观点来深入理解dup和dup2的用法
网上有很多资料详细讲解了dup和dup2的用法,有讲得不错的,但总感觉理解起来还是有点困难,通过实践,我发现一种C程序更容易理解的讲解方法-使用类比指针的方法来阐述dup和dup2的用法,可能更容易让人在非常短的时间内接受,下面的内容是我理解dup和dup2用法的总结,希望对dup和dup2存有疑惑的朋友所有帮助。
一见
2019/03/14
1.3K0
APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
3.2 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。
glm233
2020/10/09
8830
linux c——dup( )和dup2( )函数详解
dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下。
全栈程序员站长
2022/07/21
2.1K0
linux c——dup( )和dup2( )函数详解
[apue] 神奇的 Solaris pipe
说到 pipe 大家可能都不陌生,经典的pipe调用配合fork进行父子进程通讯,简直就是Unix程序的标配。
海海
2022/08/19
1K0
记一次传递文件句柄引发的血案
apue 上讲 Solaris 系统是可以在进程间通过 STREAMS 管道传递文件句柄的。
海海
2022/08/19
5030
记一次传递文件句柄引发的血案
Linux守护进程demo
       学习笔记 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int ngx_deamon(){ switch(fork()){ // fork子进程 case -1: // 说明子进程创建失败 写一些日志文件 return -1; case
Ch_Zaqdt
2020/03/19
2.2K0
耗时两天,优化失败
在上一篇文章基于线程池的线上服务性能优化中,我们提到了使用线程池进行某个业务功能优化,在上线之后,实时性提高了大概24-30倍样子,基本能够满足实时性要求。在正常运行了几天之后,突然收到了报警,提示popen失败,于是打开了日志,发现有如下提示:
高性能架构探索
2022/08/25
5340
耗时两天,优化失败
Golang实现守护进程
因为Golang没有Linux的fork()系统调用, 所以实现守护进程要使用一些小技巧. Golang为*nix(unix/linux/FreeBSD...)系统提供了syscall.ForkExec()调用, 这个调用跟fork()调用不一样, syscall.ForkExec需要提供一个要执行的程序路径. syscall.ForkExec()原型如下:
用户7686797
2020/08/25
3.6K0
15(进程间通信)
管道是Unix系统IPC最古老的方式。管道有下列两种局限性: (1) 历史上,它们是半双工的(即数据只能在一个方向上流动)。 (2) 它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父子进程就可以应用该管道
提莫队长
2019/02/21
5800
Nginx(4):守护进程,一份nginx实现,一份我的实现,看着拿呗
nginx的源码是比muduo要复杂些哈,muduo跟我以前写过的服务端项目有很多共通之处,就相当于是剥离了业务代码的网络层框架,所以看起来也比较亲切。这个nginx就感觉稍微有点陌生哈。
看、未来
2021/10/09
1.2K0
Linux下exec函数族详解
       对于exec函数族来说,它的作用通俗来说就是使另一个可执行程序替换当前的进程,当我们在执行一个进程的过程中,通过exec函数使得另一个可执行程序A的数据段、代码段和堆栈段取代当前进程B的数据段、代码段和堆栈段,那么当前的进程就开始执行A中的内容,这一过程中不会创建新的进程,而且PID也没有改变。
Ch_Zaqdt
2020/03/02
8.7K0
如何让程序真正地在后台运行?
来源:公众号【编程珠玑】 作者:守望先生 ID:shouwangxiansheng 如何实现一个守护进程?如何让程序在后台运行?这是后台开发面试常问的一道题,那么守护进程到底是什么?又该如何实现?
编程珠玑
2019/12/16
2.6K0
Ubuntu12.04下pulseaudio的安装以及API使用
libavahi-client-dev libavahi-common-dev libpulse-mainloop-glib0 libpulse0
ccf19881030
2019/04/23
2.2K0
Ubuntu12.04下pulseaudio的安装以及API使用
3(文件IO,不带缓冲的IO)
成功则返回文件描述符,失败则返回-1 第三个参数写成/*mode_t mode */ 表示这个参数仅在创建新文件时使用 Pathname表示要打开或者创建文件的名字 Oflag可用来说明此函数的多个选项。用下面一个或多个常量进行“或”运算构成
提莫队长
2019/03/01
9580
Linux网络编程API(二)
fd: pipe函数创建的两个文件描述符对应管道两端,分别为“读”端和“写端”(可记忆为读写),即fd[0]为管道的读端,fd[1]为管道的写端。
doper
2022/09/26
1.1K0
Linux网络编程API(二)
【操作系统】孤儿/僵尸/守护进程
孤儿/僵尸/守护进程 孤儿进程和僵尸进程以及守护进程都是对调用fork()函数后子进程的描述。 孤儿进程 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。 我们可以通过kill掉父进程来模仿一个孤儿进程。 ---- 僵尸进程 一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程(这个子进程
半生瓜的blog
2023/05/13
3310
守护进程
我们知道linux有许多自带的守护进程,比如syslogd、crond、sendmail等。那用户或开发者自己编写的程序为什么也需要成为守护进程呢?
Stare
2019/03/04
2.8K0
守护进程
Linux控制台重定向方法
一些嵌入式设备,一般都会留有调试串口,经由RS232/485标准与PC的COM口相连,将打印输出在PC上显示,并可以接收PC端的输入,如下图所示:
coderhuo
2020/01/19
4.7K0
(二)Reactor模式
最近一直在看游双的《高性能linux服务器编程》一书,下载链接: http://download.csdn.net/detail/analogous_love/9673008 书上是这么介绍React
范蠡
2018/04/04
1.7K0
(二)Reactor模式
linux IO重定向
#include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include<assert.h>
用户4766018
2022/08/19
2.9K0

相似问题

为什么我的"dup2(STDIN_FILENO,fd)“不能将参数发送给grep?

11

FD_ISSET在FD_SET之后返回0

13

dup2()函数的max_fd数是多少?

22

我们可以使用dup2中的读fd和写fd作为参数吗?

23

子进程中的dup2是否更改父进程中的fd表?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文