C 过程叉是';t执行所需的代码
所以我试着执行教授给我的代码。很简单。它分叉,检查分叉是否正常工作,然后在单独的文件中执行另一位代码 出于某种原因,在我的OSX10.9.5机器上,它无法执行第二位代码。以下是两个程序: 练习cC 过程叉是';t执行所需的代码,c,exec,fork,C,Exec,Fork,所以我试着执行教授给我的代码。很简单。它分叉,检查分叉是否正常工作,然后在单独的文件中执行另一位代码 出于某种原因,在我的OSX10.9.5机器上,它无法执行第二位代码。以下是两个程序: 练习c #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> int main() { p
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t child = fork();
if ((int)child < 0) {
fprintf(stderr, "fork error!\n");
exit(0);
} else if ((int)child > 0) {
int status;
(void) waitpid(child, &status, 0);
if (WIFEXITED(status)) {
printf("child %d exited normally and returned %d\n",
child, WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("\nchild %d was killed by signal number %d and %s leave a core dump\n",
child, WTERMSIG(status), (WCOREDUMP(status) ? "did" : "didn't"));
} else {
printf("child %d is dead and I don't know why!\n", child);
}
} else {
char *argv[] = { "./getcode" };
execve(argv[0], argv, NULL);
}
return 0;
}
及
不幸的是,我从子进程得到的唯一返回代码是0
./exercise
child 903 exited normally and returned 0
我很困惑。有人能帮忙吗
编辑:好的,所以我根据请求包括了perror(“execve”)
,它返回execve:Bad address
。那我该怎么解决呢
EDIT2:好的。我修好了。我已更改上述代码的位,以包含以下内容:
char *argv[] = { "./getcode",NULL };
execve(argv[0], argv, NULL);
空终止修复了argv问题。您没有检查
execve
调用的结果,因此我怀疑它失败了,并且子进程在main
末尾到达返回0
,您没有检查execve
调用的结果,因此我怀疑它失败了,子进程在main
的末尾到达返回0
,您没有检查execve
调用的结果,因此我怀疑它失败了,子进程在main
的末尾到达return 0
您没有检查execve
调用的结果,因此我怀疑它失败了,并且子进程在main
的末尾到达return 0
您需要使用NULL元素终止argv。从Exeve手册页:
Both argv and envp must be terminated by a NULL pointer.
另外,不清楚NULL是否对envp参数有效。Linux手册页上说
在Linux上,可以将argv指定为NULL,这与将此参数指定为指向包含单个NULL指针的列表的指针具有相同的效果。不要利用这一缺陷!这是不标准的,不可移植的:在大多数其他UNIX系统上,这样做会导致错误(EFAULT)
可能将envp指定为NULL也是不标准的。如果不需要指定环境,请使用execv not execve
您应该检查execve的返回值。并使用errno确定原因。例如,使用
perror(“execve”)
它可能会抱怨。您需要使用NULL元素终止argv。从Exeve手册页:
Both argv and envp must be terminated by a NULL pointer.
另外,不清楚NULL是否对envp参数有效。Linux手册页上说
在Linux上,可以将argv指定为NULL,这与将此参数指定为指向包含单个NULL指针的列表的指针具有相同的效果。不要利用这一缺陷!这是不标准的,不可移植的:在大多数其他UNIX系统上,这样做会导致错误(EFAULT)
可能将envp指定为NULL也是不标准的。如果不需要指定环境,请使用execv not execve
您应该检查execve的返回值。并使用errno确定原因。例如,使用
perror(“execve”)
它可能会抱怨。您需要使用NULL元素终止argv。从Exeve手册页:
Both argv and envp must be terminated by a NULL pointer.
另外,不清楚NULL是否对envp参数有效。Linux手册页上说
在Linux上,可以将argv指定为NULL,这与将此参数指定为指向包含单个NULL指针的列表的指针具有相同的效果。不要利用这一缺陷!这是不标准的,不可移植的:在大多数其他UNIX系统上,这样做会导致错误(EFAULT)
可能将envp指定为NULL也是不标准的。如果不需要指定环境,请使用execv not execve
您应该检查execve的返回值。并使用errno确定原因。例如,使用
perror(“execve”)
它可能会抱怨。您需要使用NULL元素终止argv。从Exeve手册页:
Both argv and envp must be terminated by a NULL pointer.
另外,不清楚NULL是否对envp参数有效。Linux手册页上说
在Linux上,可以将argv指定为NULL,这与将此参数指定为指向包含单个NULL指针的列表的指针具有相同的效果。不要利用这一缺陷!这是不标准的,不可移植的:在大多数其他UNIX系统上,这样做会导致错误(EFAULT)
可能将envp指定为NULL也是不标准的。如果不需要指定环境,请使用execv not execve
您应该检查execve的返回值。并使用errno确定原因。例如,使用
perror(“execve”)
它可能会抱怨。好的,很抱歉我弄错了,在用空指针终止argv后,它工作了!谢谢你的帮助。我本想早点尝试,但它一开始确实有效,经过几次编辑后就停止了工作。再次感谢!酷。那些行为不明的依赖数据的bug是令人讨厌的。好吧,很抱歉我弄糊涂了,在用空指针终止argv之后,它开始工作了!谢谢你的帮助。我本想早点尝试,但它一开始确实有效,经过几次编辑后就停止了工作。再次感谢!酷。那些行为不明的依赖数据的bug是令人讨厌的。好吧,很抱歉我弄糊涂了,在用空指针终止argv之后,它开始工作了!谢谢你的帮助。我本想早点尝试,但它一开始确实有效,经过几次编辑后就停止了工作。再次感谢!酷。那些行为不明的依赖数据的bug是令人讨厌的。好吧,很抱歉我弄糊涂了,在用空指针终止argv之后,它开始工作了!谢谢你的帮助。我本想早点尝试,但它一开始确实有效,经过几次编辑后就停止了工作。再次感谢!酷。那些行为不明的依赖数据的bug是令人讨厌的。char*argv[]={./getcode],NULL}代码>char*argv[]={./getcode],NULL}代码>char*argv[]={./getcode],NULL}