Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3400178
  • 博文数量: 198
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7246
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-23 18:56
个人简介

将晦涩难懂的技术讲的通俗易懂

文章分类

全部博文(198)

文章存档

2023年(9)

2022年(4)

2021年(12)

2020年(8)

2019年(18)

2018年(19)

2017年(9)

2016年(26)

2015年(18)

2014年(54)

2013年(20)

分类: LINUX

2014-08-06 16:43:01

进程将fd重定向后对exec的影响


我们使用两个测试程序来验证,test.cpp用来实现从标准输入读入数据,然后将数据原样输出。代码如下:

test.cpp

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #define BUFFSIZE 1024
  5. using namespace std;

  6. int main(void)
  7. {
  8.     char buf[BUFFSIZE];
  9.     int n;
  10.     while( (n=read(STDIN_FILENO,buf,BUFFSIZE))>0) //从标准输入读取数据
  11.         write(STDOUT_FILENO,buf,n); //向标准输出输出数据
  12.     exit(0);
  13. }

编译运行如下:

test1的作用是将标准输入重定向到打开的文件(这里选择打开自己的源码test1.cpp),然后执行test
test1.cpp

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdlib.h>
  5. #include <fcntl.h>
  6. #define MAXLINE 1024
  7. using namespace std;
  8. int main(int argc, char *argv[])
  9. {
  10.     int fd;
  11.     if((fd=open("./test1.cpp",O_RDONLY))==-1)//打开程序自身的源文件
  12.     {
  13.         perror("open");
  14.         exit(1);
  15.     }
  16.     dup2(fd,STDIN_FILENO); //将fd复制到标准输入(将标准输入重定向到fd,即test1.cpp文件)
  17.     
  18.     if( (execl("./test",(char*)0))==-1 ) //执行test程序
  19.     {
  20.         perror("execl");
  21.         exit(1);
  22.     }
  23. }

我们执行test1效果如下:

可见test进程的标准输入也被重定向到了test1.cpp文件。实验结果表明,在不设置CLOSE_ON_EXEC标准时,执行exec后进程保持之前的文件描述符状态。

阅读(4581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~