我基本上创建了一个函数,它调用内置函数的unix并将其输出重定向到"myexec.txt"
。所以我在子进程中调用open
和dup2
。他们将execve
的输出重定向到"myexec.txt"
。在调用execve
时,子进程终止,并且在执行execve
之后的每个其他标准输出现在将被引导到终端。我正在寻找一种方法来终止子进程,以防止对execve
进行非语法调用,以便将输出重定向停止到myexec.txt
。我知道使用exit
有效,但有没有办法在不返回值的情况下终止此进程?我的函数需要返回void
。
这是我的代码块。我故意给execve
一条不存在的路径。
void myexec()
{
pid_t pid;
pid = fork();
if(pid == 0)
{
printf("executing ls\n");
char *argv[] = {"ls", 0};
int fd = open("myexec.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
execve("/bsin/ls", &argv[0], NULL);
fprintf(stderr, "Failed to execute");
......
}
wait(NULL);
printf("Function execution have been attempted");
}
答案 0 :(得分:1)
请勿致电exit
。这是一个严重的错误,过去曾造成严重的安全隐患。
致电_exit
。您可以将它传递给零,如果父级不关心子级是成功还是失败,则无关紧要。由于_exit
保证不会返回,因此您不需要在此之后添加任何其他内容。
if(pid == 0)
{
printf("executing ls\n");
char *argv[] = {"ls", 0};
int fd = open("myexec.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
execve("/bsin/ls", &argv[0], NULL);
fprintf(stderr, "Failed to execute");
_exit(EXIT_FAILURE);
}