Волшебство в C с malloc, вилкой и открытым - PullRequest
0 голосов
/ 03 декабря 2011

У меня такая забавная проблема, о которой я думал, что поделюсь с вами.

Я загнал ее в угол для самой маленькой программы, которую я мог:

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

4 голосов
/ 03 декабря 2011

open(2) принимает как минимум два параметра. Поскольку вы передаете ему только один аргумент, вы вызываете неопределенное поведение. В этом случае open() просто использует некоторый мусор в качестве второго аргумента.

2 голосов
/ 03 декабря 2011

Вам нужно #include <fcntl.h>, чтобы получить объявление для open() в области видимости, которое затем сообщит вам, что вы не вызываете его с достаточным количеством аргументов:

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

(Необязательный аргумент - единственное число - это разрешения для файла (mode_t perms), если у вас есть O_CREAT среди опций в аргументе flags.)

Вызов malloc() набрасывает на стеке, достаточном для первоначального удаления нулей на нем, что оставляет «дополнительные аргументы» для open() в состоянии, когда они не равны нулю, и вы сталкиваетесь с проблемами.

Неопределенное поведение - которое вы вызываете - может привести к любому странному результату.

Убедитесь, что вы компилируете как минимум с '1017 *', и я рекомендую 'gcc -Wmissing-prototypes -Wstrict-prototypes -Wall -Wextra'.

1 голос
/ 03 декабря 2011

Файл заголовка для open отсутствует, и при открытии ожидается как минимум второй параметр.

Если вы исправите это, то все должно быть в порядке.

...