Ъγ:_小ツ雨oο 发表于 2023-6-18 02:59:59

c执行execv 结果-1求助

# 代码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);

      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=%s,argv=%s,argv=%s\r\n",argv,argv,argv);
}


# 运行环境 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是没问题的.

Ъγ:_小ツ雨oο 发表于 2023-6-18 03:09:28

跟踪显示
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),但是不知道具体到底哪里错了。

Ъγ:_小ツ雨oο 发表于 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);

      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;
}

sfqxx 发表于 2023-6-18 11:42:28

Ъγ:_小ツ雨oο 发表于 2023-6-18 03:18
已解决
不知道为什么这里execv 必须传递main的上下文环境参数?

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

求最佳答案{:10_254:}
页: [1]
查看完整版本: c执行execv 结果-1求助