如何解决变量在 fork() 子进程 C 中突然改变 - 非常奇怪的行为
我希望这里有人可以帮助我,因为我目睹了我的 C 代码中的一些奇怪行为。
我有一个类似 Linux shell 的 C 语言程序。代码有 250 行,所以我不能在这里发布。
简而言之,我为非内置命令提供了此功能:
int not_builtin(char** args,int background,char* line) {
int status;
pid_t pid;
pid = fork();
if (pid < 0) {
printf("fork failed\n");
}
else if (pid == 0) {
if (execvp(args[0],args) == -1) {
printf("exec failed\n");
}
return 0;
}
else {
if (!background) {
if (waitpid(pid,&status,0) < 0) {
printf("An error occurred\n");
}
}
add_job(line,pid,background);
}
return 1;
}
当我在我的 PC (Macbook) 上运行我的 shell 时,一切都按预期进行。但是,当我在我的大学服务器 (Linux) 上运行它时,我遇到了一个错误。我无法正确调试它,因为在我的电脑上一切正常。错误在于它输出:"exec failed"
用于任何命令(第 9 行)。
通过打印代码,我能够检测到以下行为:
char** args
在整个代码中都很好,我将它们打印到“if (pid == 0)"
”之前。
一旦你输入了上面提到的 if 语句,打印 args 会返回一些垃圾。
具体来说,对于输入:$ ls -l
我在 if 之前打印了 ls -l
,在 if 之后打印了 ?\??
。
对于任何其他命令字符串,就像这样。
可能是什么原因?
该程序一整天都运行良好。一旦我更改了“解析行”功能,在编辑之前复制该行,它就开始发生。现在看起来像这样:
char** parse_line(char *line,int *background) {
char line_copy[BUFF_SIZE];
strcpy(line_copy,line);
char **tokens = malloc(BUFF_SIZE*sizeof(char*));
if (!tokens) {
printf("An error occurred\n");
exit(EXIT_FAILURE);
}
int position = 0;
char *token;
token = strtok(line_copy,DELIM);
while (token) {
tokens[position] = token;
position++;
token = strtok(NULL,DELIM);
}
// change the background option
if (position > 0 && strcmp(tokens[position-1],"&")==0) {
*background = 1;
tokens[position-1]=NULL;
line[strlen(line)-2] = '\0';
} else {
*background = 0;
tokens[position] = NULL;
}
return tokens;
}
在更改之前,我会直接在 strtok
上执行 line
,但现在我想我需要该值完整无缺。但这是如何以任何方式连接的?
非常感谢任何帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。