免费注册 查看新帖 |

Chinaunix

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

[C] 请大家看个Unix /linux 编程实践上的例子 [复制链接]

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-18 15:12 |只看该作者 |倒序浏览
代码如下:
  1. #include <apue.h>

  2. #define MAXARGS 20
  3. #define ARGLEN 100

  4. int main()
  5. {
  6.     char *arglist[MAXARGS+1];  //an array of ptrs*
  7.     int numargs;                //index into arrays
  8.     char argbuf[ARGLEN];        //read stuff here
  9.     char *makestring();         //malloc etc
  10.     numargs = 0;
  11.     while (numargs < MAXARGS)
  12.     {
  13.         printf("Arg[%d]?",numargs);
  14.         if(fgets(argbuf,ARGLEN,stdin) && *argbuf!='\n')
  15.             arglist[numargs++]=makestring(argbuf);
  16.         else
  17.         {
  18.             if(numargs > 0){
  19.                 arglist[numargs]=NULL;
  20.                 execute(arglist);
  21.                 numargs=0;
  22.                 }
  23.             }
  24.         }
  25.     return 0;
  26.     }


  27. int execute(char *arglist[])
  28. {
  29.     execvp(arglist[0],arglist);
  30.     perror("execvp failed");
  31.     exit(1);
  32.     }

  33. char *makestring(char *buf)
  34. {
  35.     char *cp;

  36.     buf[strlen(buf)-1]='\0';
  37.     cp=malloc(strlen(buf)+1);
  38.     if(cp==NULL){
  39.         fprintf(stderr,"no memory\n");
  40.         exit(1);
  41.         }
  42.     strcpy(cp,buf);
  43.     return cp;
  44.     }
复制代码
说白了就是用exec* 在当前bash 下覆盖,exit退出,应该退出当前bash进程。
但是实际执行的时候不是如此:
  1. [root@ system_program]# ./psh1
  2. Arg[0]?pwd
  3. Arg[1]?
  4. /usr/local/src/c/system_program
  5. [root@ system_program]#
复制代码
这是为什么?
是bash 现在的运行机制吗?

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
2 [报告]
发表于 2016-01-18 15:18 |只看该作者
没看出有什么结果不对....

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
3 [报告]
发表于 2016-01-18 15:31 |只看该作者
exec 覆盖的是调用它的进程 ./psh1 , 不是什么当前 bash;

bash 内建命令 exec 才能覆盖自己。你直接 ./psh1 是先 fork() 一个child process,child process 里面再 exec

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
4 [报告]
发表于 2016-01-18 15:43 |只看该作者
LS 说的是啊,我后来才想到 bash 是先fork出psh1 ,然后exec 的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP