免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4129 | 回复: 10
打印 上一主题 下一主题

代码中exec/system执行的外部程序,能否用匿名管道与之通信? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-31 13:15 |只看该作者 |倒序浏览
10可用积分
本帖最后由 kgisme170 于 2010-08-31 13:16 编辑

如题。
我有一个很简单的程序
>cat my.cpp
#include<iostream.h>
int main(void){
   cin>>a>>b
   cout<<a+b<<endl;
   return 0;
}

然后我想用一个程序来和它通信,这个程序叫father.cpp,它读入一个文本文件(2个数字)
>cat my.txt
20 30

father.cpp创建管道,给my这个程序输入my.txt的内容,然后从管道得到my这个程序的输出,写入out.txt文件。
-----------------------------------------------------------------------------------------------------
father.cpp这个程序应该如何写?
问题是: 用exec和system创建出来的程序my,可否在father.cpp里面通过修改其stdin和stdout的指向,指定为我创建的管道fd,来达到通信的目的?
期待的结果: 我运行father,得到out.txt文件,里面的内容是"50"


还望各位大虾指点,谢谢!!!!!!!!!

论坛徽章:
0
2 [报告]
发表于 2010-08-31 13:15 |只看该作者
  1. jackin@jackin-desktop:~/xxx$ cat xxx.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>

  6. #define INPUT_STR         "23 45\n"
  7. int main()
  8. {
  9.         int  p2c[2];
  10.         int         c2p[2];
  11.         pid_t pid;
  12.         char buff[128] = {0};

  13.         if(pipe(p2c) || pipe(c2p))
  14.         {
  15.                 printf(" pipe error\n");
  16.                 return -1;
  17.         }
  18.        
  19.         pid = vfork();
  20.         if( pid < 0 )
  21.         {
  22.                 printf(" fork error\n");
  23.                 return -1;
  24.         }
  25.         else if( pid )  ///parent
  26.         {
  27.                 close(p2c[0]);
  28.                 close(c2p[1]);
  29.                
  30.                 write(p2c[1], INPUT_STR, strlen(INPUT_STR));
  31.                 read(c2p[0], buff, sizeof(buff));
  32.                
  33.                 printf("Answer:%s\n",buff);
  34.                
  35.                 return 0;
  36.         }
  37.         else                        //// child
  38.         {
  39.                 close(p2c[1]);
  40.                 close(c2p[0]);
  41.                 close(0);
  42.                 close(1);
  43.                
  44.                 dup2(p2c[0], 0);
  45.                 dup2(c2p[1], 1);
  46.                
  47.                 execl("./add", NULL);
  48.         }
  49. }
  50.        
  51. jackin@jackin-desktop:~/xxx$ cat test.c
  52. #include <stdio.h>

  53. #include <stdlib.h>

  54. int main()
  55. {
  56.         int a, b;
  57.        
  58.         scanf("%d %d", &a, &b);
  59.         printf("%d", a+b);
  60. }
  61. jackin@jackin-desktop:~/xxx$ ./a.out
  62. Answer:68
  63. jackin@jackin-desktop:~/xxx$
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-08-31 13:22 |只看该作者
你只需要了解管道的概念就可以了。

你这种情况用pipe()就可以了。一个读,一个写

还有就是你的表达能力不是一般的差。描述问题不是一般的遭。

发贴前,先组织好语言,然后把问题描述清楚。
你表达能力都不行,写程序也写好不了。

论坛徽章:
0
4 [报告]
发表于 2010-08-31 13:48 |只看该作者
我的问题是,
如果是用fork产生的子程序的话,可以继承管道fd,通信很容易。

但是我要执行一个外部程序,如何和它通过管道通信?

谢谢。

论坛徽章:
0
5 [报告]
发表于 2010-08-31 14:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2010-08-31 14:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-08-31 14:16 |只看该作者
搞个  有名管道,  不管两个进程关系如何,都可以通信。

论坛徽章:
0
8 [报告]
发表于 2010-08-31 14:19 |只看该作者
一个程序用PIPE创建管道, EXEC另一个程序的时候,将管道号用参数传给他, 新进程就可以用了.

论坛徽章:
0
9 [报告]
发表于 2010-08-31 14:31 |只看该作者
popen   

论坛徽章:
0
10 [报告]
发表于 2010-08-31 15:34 |只看该作者
exec所执行的进程会默认继承当前进程所打开的fd, 如果在exec之前把管道dup2到stdin/stdout, exec所执行的程序就可以通过stdin/stdout来使用其创建者所打开的管道了. 大概是这样

pipe(fd[2])
dup2(fd[0], 0)
dup2(fd[1], 1)
fork()
// in child process
exec()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP