我有一个有趣的问题,我以为我会和你分享。
我把它逼到了我能做的最小的程序:
#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,打开工作就好了。 你只需要编译并给程序一个(有效的)文件来看看魔术。
答案 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
的头文件丢失,打开时至少需要第二个参数。
如果你确定它应该没问题。