C中的魔术与malloc,fork和open

时间:2011-12-02 21:37:08

标签: c file-io malloc fork

我有一个有趣的问题,我以为我会和你分享。

我把它逼到了我能做的最小的程序:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int cmd_left(char *name)
{
  pid_t pid;
  int   f_d;

  if ((pid = fork()) == -1)
    {
      perror("");
      exit(1);
    }
  f_d = open(name);
  printf("%d\n", f_d);
  close(f_d);
}

int main(int ac, char **av, char **env)
{
  char **dummy_env;

  if (ac < 2)
    return (0);
  dummy_env = malloc(10);
  cmd_left(av[1]);
}

基本上,如果我删除malloc,打开工作就好了。 你只需要编译并给程序一个(有效的)文件来看看魔术。

3 个答案:

答案 0 :(得分:4)

open(2)至少需要两个参数。由于您只传递一个参数,因此您正在调用未定义的行为。在这种情况下,open()只是使用一些垃圾作为第二个参数。

答案 1 :(得分:2)

您需要#include <fcntl.h>在范围内获取open()的声明,然后告诉您没有使用足够的参数调用它:

int open(const char *filename, int flags, ...);

(如果mode_t perms参数中的选项中有O_CREAT,则可选参数 - singular - 是文件(flags)的权限。)

malloc()的调用会在最初的堆栈上乱涂乱删除它上面的零,这会使open()的“额外参数”处于不为零的状态,并且会遇到问题。

未定义的行为 - 您正在调用它 - 可能会导致任何奇怪的结果。

请确保至少使用“gcc -Wall”进行编译,并推荐“gcc -Wmissing-prototypes -Wstrict-prototypes -Wall -Wextra”。

答案 2 :(得分:1)

open的头文件丢失,打开时至少需要第二个参数。

如果你确定它应该没问题。