免费注册 查看新帖 |

Chinaunix

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

[函数] 有关execl 和stdout [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-28 16:46 |只看该作者 |倒序浏览
程序片段:
++++++++++++++++++++++++++++++++++++++++
int main(int argc,char *argv[],char *envp[]) {

      char name[20];
      char *p;
      scanf("%s",name);
      p=name;
      printf("\n");
      execl("/usr/bin/openssl","openssl","passwd","-1",p,0);//此处忽略fork不考虑先。
      return 0;}
+++++++++++++++++++++++++++++++++++++++++
这里execl成功无返回。但是我把stdout内容保存下来存起来,然后插入到数据库的password中去。
不知道该怎么操作呢。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>


int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE *fp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buf[100];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[30];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buf,'\0',sizeof(buf));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s",name);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(buf,"openssl passwd -1 ");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(buf,name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp=popen(buf,"w");//fp=popen(buf,"r");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

执行:
root@mail:/media/addpsqlusr/pipe_fork# ./tmp
jjkhf

$1$2TqVfMI6$c9V.2KbyP6/AayOg9Ocdd1

这里我们看到换行打印到运行结果前,是不是说子进程运行在父进程之后的呢?

[ 本帖最后由 hylinux 于 2008-1-31 23:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-28 16:49 |只看该作者
dup2 把stdout重定向到管道,然后父进程读这个管道。

论坛徽章:
0
3 [报告]
发表于 2008-01-28 16:54 |只看该作者
原帖由 cugb_cat 于 2008-1-28 16:49 发表
dup2 把stdout重定向到管道,然后父进程读这个管道。


不过先要来个 pipe()

论坛徽章:
0
4 [报告]
发表于 2008-01-28 17:10 |只看该作者
原帖由 langue 于 2008-1-28 16:54 发表


不过先要来个 pipe()

论坛徽章:
0
5 [报告]
发表于 2008-01-28 18:07 |只看该作者

回复 #3 langue 的帖子

还是没有完全明白哟!
能不能举个例子呢!
对pipe()很生疏。。。学习学习!

论坛徽章:
0
6 [报告]
发表于 2008-01-28 18:15 |只看该作者
原帖由 hylinux 于 2008-1-28 18:07 发表
还是没有完全明白哟!
能不能举个例子呢!
对pipe()很生疏。。。学习学习!


pipe() 一下然后 fork(),子进程关闭一端的读,父进程关闭另一端的写,再关掉子进程的 stdout,用 dup2() 连到 fd=1,管道就通了
(别忘了给子进程收尸)
具体做法看一下 pipe(2)

当然如果嫌麻烦还可以用 popen(3)

论坛徽章:
0
7 [报告]
发表于 2008-01-28 18:54 |只看该作者
去看APUE,书上有例子。

论坛徽章:
0
8 [报告]
发表于 2008-01-28 19:59 |只看该作者
原帖由 cugb_cat 于 2008-1-28 18:54 发表
去看APUE,书上有例子。


是的,完整的例子,不过我得承认我也只是看了看手册

论坛徽章:
0
9 [报告]
发表于 2008-01-28 20:01 |只看该作者
原帖由 langue 于 2008-1-28 19:59 发表


是的,完整的例子,不过我得承认我也只是看了看手册

版主毕业了没?好像记得是上研究生呢吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP