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是没问题的.
跟踪显示
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),但是不知道具体到底哪里错了。 已解决
不知道为什么这里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;
}
Ъγ:_小ツ雨oο 发表于 2023-6-18 03:18
已解决
不知道为什么这里execv 必须传递main的上下文环境参数?
`execv`函数的第一个参数是要执行的可执行文件的路径,函数将会运行这个可执行文件并替换当前进程的代码和数据段。因此,需要传递 `main` 函数中的上下文环境参数,以便新程序可以正确地获得入口点并知道如何处理命令行参数等信息。如果不传递这些参数,新程序可能无法正确地运行或处理命令行参数。
求最佳答案{:10_254:}
页:
[1]