C 过程叉是';t执行所需的代码

C 过程叉是';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

所以我试着执行教授给我的代码。很简单。它分叉,检查分叉是否正常工作,然后在单独的文件中执行另一位代码

出于某种原因,在我的OSX10.9.5机器上,它无法执行第二位代码。以下是两个程序:

练习c

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