鱼C论坛

 找回密码
 立即注册
查看: 798|回复: 3

[已解决]c执行execv 结果-1求助

[复制链接]
发表于 2023-6-18 02:59:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 代码demo11.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>   // 包含 wait 函数头文件

int main(int argc,char *argv[]) {

    int pid = fork();

    if (pid == 0){
        char  *const ar[] = {"china","test"};

        printf("%s\n",argv[0]);

        char *run = "/home/ubuntu/c/demo12";
        int ret = execv(run,ar);

        if (ret == -1){
            perror("execv");
        }

        printf("ret=%d\r\n",ret);

        return 0;
    }

    int child_pid;

    child_pid = wait(NULL);

    if (child_pid > 0){
        printf("exit pid = %d\r\n",pid);
    }

    return 0;
}

# 代码demo12.c
#include <stdio.h>

int main(int argc,char *argv[]) {
    printf("argv[0]=%s,argv[1]=%s,argv[2]=%s\r\n",argv[0],argv[1],argv[2]);
}

# 运行环境 ubuntu18.4

运行:
/home/ubuntu/c/demo11 /home/ubuntu/c/demo12

返回结果

ubuntu@VM-8-11-ubuntu:~/c$ ./demo11
./demo11
execv: Bad address
ret=-1
exit pid = 30007



# 尝试
编译后 给demo11和demo12都加了 chomd+x权限都还是不行,
单独运行demo12是没问题的.
最佳答案
2023-6-18 11:42:28
Ъγ:_小ツ雨oο 发表于 2023-6-18 03:18
已解决
不知道为什么这里execv 必须传递main的上下文环境参数?

`execv`函数的第一个参数是要执行的可执行文件的路径,函数将会运行这个可执行文件并替换当前进程的代码和数据段。因此,需要传递 `main` 函数中的上下文环境参数,以便新程序可以正确地获得入口点并知道如何处理命令行参数等信息。如果不传递这些参数,新程序可能无法正确地运行或处理命令行参数。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 03:09:28 | 显示全部楼层
跟踪显示
[pid   646] execve("/home/ubuntu/c/demo12", ["china", "test", "\2", 0xbb3f77b008794e00, "AWAVI\211\327AUATL\215%f\4 ", "\211\307\350\202\24\2", 0x2, "\t'\232\236\377\177", 0x200008000, "UH\211\345H\203\354P\211}\274H\211u\260dH\213\4%("], 0x7fff9e9a0720 /* 25 vars */) = -1 EFAULT (Bad address),但是不知道具体到底哪里错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-18 03:18:43 | 显示全部楼层
已解决
不知道为什么这里execv 必须传递main的上下文环境参数?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>   // 包含 wait 函数头文件

int main(int argc,char *argv[]) {

    int pid = fork();

    if (pid == 0){
//        char  *ar[] = {"china","test"};
        char *argv2[] = {"ls", "bb"};

        printf("%s\n",argv[0]);

        char *run = "/home/ubuntu/c/demo12";
//        int ret = execv(run,argv2);
        int ret = execv(run,argv);


        if (ret == -1){
            perror("execv");
        }

        printf("ret=%d\r\n",ret);

        return 0;
    }

    int child_pid,child_status;

    child_pid = wait(&child_status);


    if (child_pid > 0){
        printf("exit pid = %d,exit status = %d\r\n",pid,child_status);
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-18 11:42:28 | 显示全部楼层    本楼为最佳答案   
Ъγ:_小ツ雨oο 发表于 2023-6-18 03:18
已解决
不知道为什么这里execv 必须传递main的上下文环境参数?

`execv`函数的第一个参数是要执行的可执行文件的路径,函数将会运行这个可执行文件并替换当前进程的代码和数据段。因此,需要传递 `main` 函数中的上下文环境参数,以便新程序可以正确地获得入口点并知道如何处理命令行参数等信息。如果不传递这些参数,新程序可能无法正确地运行或处理命令行参数。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-18 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表