免费注册 查看新帖 |

Chinaunix

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

[函数] 关于apue.2e的system函数的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-06 19:50 |只看该作者 |倒序浏览
在system函数中:

#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
int
system(const char *cmdstring) /* version without signal handling */
{
pid_t pid;
int  status;
if (cmdstring == NULL)
  return(1);  /* always a command processor with UNIX */
if ((pid = fork()) < 0) {
  status = -1; /* probably out of processes */
} else if (pid == 0) {    /* child */
  execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
  _exit(127);  /* execl error */
} else {       /* parent */
  while (waitpid(pid, &status, 0) < 0) {
   if (errno != EINTR) {
    status = -1; /* error other than EINTR from waitpid() */
    break;
   }
  }
}
return(status);
}

execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);的"sh"是什么意思? 拿来有什么用?
我做了下实验:
把execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);换成execl("/bin/sh", "xx", "-c", cmdstring, (char *)0);
程序照样能正常运行,但是如果直接把"sh"删了,就不行~
根据这个实验我猜测/bin/sh所指向的文件/bin/bash是一个解释器文件,但是用vi查看其内容并没有#! pathname .....,而
是一个二进制文件,为什么,想不通~~~~

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2007-09-06 19:53 |只看该作者
兄弟多看一下execl函数的说明就明白了。
这个函数第一个参数时要执行命令的绝对路径,第二个要求的就是该命令的名称

论坛徽章:
0
3 [报告]
发表于 2007-09-06 20:12 |只看该作者
帅哥,在apue.2e中有这句话:

p192
我们将第一个参数(新程序中的argv[0])设置为路径名的文件名分量.某些shell将此参数设置为完成的路径名.这只是一个惯例~.我们可以将argv[0]设置为任意字符串~~~~

我对这句话的理解为:
int execl(const char *pathname, const char *argv0, ...)
argv0可以为任意参数,而并不单单是该命令的名称

偶理解错误的地方请纠正~

论坛徽章:
0
4 [报告]
发表于 2007-09-06 20:45 |只看该作者
hehe, 犯错误了。回帖不看贴,算我没说:)

[ 本帖最后由 ivhb 于 2007-9-6 20:47 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-09-06 20:55 |只看该作者

回复 #3 zxkevin 的帖子

[quote]argv0可以为任意参数,而并不单单是该命令的名称[\quote]
对。
这种问题,自己写个程序试下不就知道了?

[ 本帖最后由 lgfang 于 2007-9-6 21:03 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-09-06 21:02 |只看该作者
原帖由 zxkevin 于 2007-9-6 19:50 发表 我做了下实验:
把execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);换成execl("/bin/sh", "xx", "-c", cmdstring, (char *)0);
程序照样能正常运行,但是如果直接把"sh"删了,就不行~  


要用bash执行一个命令的话,调用方式是 bash -c cmdstring。system 调用的时候,如果把第二个参数(“sh“)删掉,就变成 bash cmdstring 了("-c"成了程序名了),所以不行。

man bash
      -c string If  the  -c  option  is  present, then commands are read from
                 string.  If there are arguments after the  string,  they  are
                 assigned to the positional parameters, starting with $0.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP