gpt4 book ai didi

c - 即使文件不存在,execvp 也不返回

转载 作者:行者123 更新时间:2023-11-30 17:57:29 25 4
gpt4 key购买 nike

我正在为类编写一个小 shell。对于非内置命令,我调用 execvp 。在开发这个的过程中,它正常返回-1,一切正常。然而现在,我可以在 shell 中输入任何内容,它会启动一个进程,该进程立即以状态 11(SIGSEGV,段错误)终止。

Meta:我尝试将其缩减为 SSCCE,但没有成功:当我删除 execvp 周围的所有内容时,它会正常运行。我很高兴提供完整的源代码,但超过 750 行在这一点上似乎过多。

这是调用 execvp 的函数。

void eval(char *cmdline)
{
char **argv = malloc(MAXLINE);
int bg = parseline(cmdline,argv);

if (argv[0] == 0)
{
free(argv);
return;
}
if(builtin_cmd(argv) == 0)
{
pid_t pid;
sigset_t set, oset;

/* set mask */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_SETMASK, &set, &oset);

/* proceed to fork */
if ((pid = Fork()) == 0)
{
app_debug("execvp <%s>", argv[0]);
setpgid(0,0);
sigprocmask(SIG_UNBLOCK, &set, &oset);
execvp(argv[0], argv);
app_notify("%s command not found.", errno, argv[0]);
exit(0);
} else if (pid == -1) {
app_notify("fork failed");
return;
} else {
addjob(jobs, pid, bg + 1, cmdline);
sigprocmask(SIG_UNBLOCK, &set, &oset);
if (bg == 0) {
app_debug("[%d] (%d) Waiting for %s", pid2jid(pid), pid, cmdline);
waitfg(pid);
} else {
app_notify("[%d] (%d) %s", pid2jid(pid), pid, cmdline);
}
}
}
free(argv);
return;
}

这是解析线。

int parseline(const char *cmdline, char **argv)
{
static char array[MAXLINE]; /* holds local copy of command line */
char *buf = array; /* ptr that traverses command line */
char *delim; /* points to first space delimiter */
int argc; /* number of args */
int bg; /* background job? */

strcpy(buf, cmdline);
buf[strlen(buf)-1] = ' '; /* replace trailing '\n' with space */
while (*buf && (*buf == ' ')) /* ignore leading spaces */
buf++;

/* Build the argv list */
argc = 0;
if (*buf == '\'') {
buf++;
delim = strchr(buf, '\'');
}
else {
delim = strchr(buf, ' ');
}

while (delim) {
argv[argc++] = buf;
*delim = '\0';
buf = delim + 1;
while (*buf && (*buf == ' ')) /* ignore spaces */
buf++;

if (*buf == '\'') {
buf++;
delim = strchr(buf, '\'');
}
else {
delim = strchr(buf, ' ');
}
}
argv[argc] = NULL;

if (argc == 0) /* ignore blank line */
return 1;

/* should the job run in the background? */
if ((bg = (*argv[argc-1] == '&')) != 0) {
argv[--argc] = NULL;
}
return bg;
}

最佳答案

紧接着 execvp,app_notify("%s command not find.", errno, argv[0]); seg 出现故障。它本质上包装了一个 printf,并且在带引号的字符串后面应该只有一个参数,因为只有一个替换。

调试此问题的关键是发现 gdb 的set follow-fork-mode child

感谢吉姆等人的帮助。

关于c - 即使文件不存在,execvp 也不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12789050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com