gpt4 book ai didi

c - fork 和 execve 段错误

转载 作者:行者123 更新时间:2023-12-05 01:33:12 25 4
gpt4 key购买 nike

我的程序应该使用 fork 和 exec 系统调用。 exec 应该更改子进程,使其将另一个命令作为参数并执行那个命令。例如,要显示当天的消息:

 ./myexec cat /etc/motd

这是我当前的代码

extern char **environ;      /* environment info */
main(int argc, char **argv) {
/* argc -- number of arguments */
/* argv -- an array of strings */

char *argvNew[argc + 1];
int pid;

for(int i=0; i<argc; i++){
argvNew[i] = argv[i];
}
argvNew[argc + 1] = NULL;
printf("After For: %s\n",argvNew[0]);
printf("After For: %s\n",argvNew[1]);
printf("After For: %s\n",argvNew[2]);
printf("After For: %s\n",argvNew[3]);


if ((pid = fork()) < 0) {
fprintf(stderr, "Fork error%sstrerror\n", strerror(errno));

exit(1);
}
else if (pid == 0) {
/* child process */
if (execve(argvNew[0], argvNew, environ) < 0) {
fprintf(stderr, "Execve error%d %s\n",errno,strerror(errno));
exit(1);
}
}
else {
/* parent */
wait(0); /* wait for the child to finish */
}

}

运行 ./myexecv cat etc/motd 后没有任何反应;只是打印语句。有什么建议吗?

最佳答案

显示的代码中存在多个错误。

    for(int i=0; i<argc; i++){
argvNew[i] = argv[i];
}
argvNew[argc+1] = NULL;

从表面上看,NULL 分配是错误的,并且会导致未定义的行为,因为 argvNew 声明为

    char *argvNew[argc + 1];

因此数组包含值 argvNew[0]argvNew[argc],并且 argvNew[argc+1]=NULL; 运行超出数组的末尾,导致未定义的行为。这显然应该是

    argvNew[argc] = NULL;

但即使那样也是错误的,因为:

 execve(argvNew[0], argvNew, environ);

argvNew[0] 是从 argv[0] 复制而来的,这是正在执行的程序的名称。这将在子进程中 fork 并运行相同的程序。

你最终会用 fork 轰炸自己。如果这是一个共享服务器,你会让系统管理员非常非常生气。

您需要从等式中删除 argv[0],然后仅复制 argv[1],等等。正确的循环和复制是:

    int pid;
char *argvNew[argc];

for(int i=1; i<argc; i++){
argvNew[i-1] = argv[i];
}
argvNew[argc-1] = NULL;

关于c - fork 和 execve 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312730/

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