免费注册 查看新帖 |

Chinaunix

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

[Linux] exec函数的问题 [复制链接]

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-01-16 06:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-23 14:31 |只看该作者 |倒序浏览
int main(int argc, char **argv)
{
        pid_t pid;
        char *argp[] = {"echo", "$USER", NULL};
        char *envp[] = {"USER=weizi", NULL};

        if ((pid = fork()) == -1)
                err_sys("fork error");
        else if (pid == 0) {
                if (execl("/bin/echo", "echo", "$USER", (char *)0) == -1)
                        err_sys("execl error");
        }
        if (waitpid(pid, NULL, 0) == -1)
                err_sys("waitpid error");

        if (execvpe("echo", argp, envp) == -1)
                err_sys("execvpe error");

        exit(0);
}

那么问题来了,为什么用exec启动一个新程序,echo $USER结果是打印$USER,而不是打印这个环境变量???

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-12-23 14:49 |只看该作者
个人理解:
比如你在shell中命令行echo $USER 这是可以打印出用户名字的,原因是在执行echo命令之前,会去做一个变量的替换
echo $USER ,变量替换之后变为 echo xxxx ,此时传递给echo命令的参数就是xxxx

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
3 [报告]
发表于 2014-12-23 14:50 |只看该作者
又到了每天一问的时间了:wink:

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 2014-12-23 14:51 |只看该作者
补充一句,变量替换是在shell进程中完成的,而不是在echo命令中完成的

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
5 [报告]
发表于 2014-12-23 15:01 |只看该作者
看看这个图

2014-12-23 14:57:35的屏幕截图.png (431.87 KB, 下载次数: 39)

2014-12-23 14:57:35的屏幕截图.png

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-01-16 06:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00
6 [报告]
发表于 2014-12-25 13:48 |只看该作者
我用bash来调用一个shell脚本还是不能得到正确的结果。回复 5# super皮波


   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
7 [报告]
发表于 2014-12-25 13:57 |只看该作者
回复 6# CanuxCheng
贴脚本看看

   

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-01-16 06:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00
8 [报告]
发表于 2014-12-25 16:40 |只看该作者
int main(int argc, char **argv)
{
    pid_t pid;
    char *argp[] = {"bash", "-c", "echo $USER", NULL};
    char *envp[] = {"USER=weizi", NULL};

    if ((pid = fork()) == -1)
        err_sys("fork error");
    else if (pid == 0) {
        if (execl("/bin/bash", "bash", "-c", "echo $USER", (char *)0) == -1)
            err_sys("execl error");
    }
    if (waitpid(pid, NULL, 0) == -1)
        err_sys("waitpid error");

    if (execvpe("bash", argp, envp) == -1)
        err_sys("execvpe error");

    exit(0);
}
是的,测试通过了,之前没有加-c选项。回复 7# super皮波


   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
9 [报告]
发表于 2014-12-25 16:46 |只看该作者
回复 8# CanuxCheng
-c选项干嘛用的

   

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-01-16 06:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00
10 [报告]
发表于 2014-12-25 18:31 |只看该作者
用来指定一个bash脚本,如果在命令行就可以省略。回复 9# super皮波


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP