gpt4 book ai didi

shell : Execvp prints output and then segmentation fault occurs when executing a background process 的 C 程序

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:56 28 4
gpt4 key购买 nike

我正在编写一个简单的 C 程序来创建我自己的 shell。它将输入作为命令并执行它们。但是当我尝试在后台执行一个进程时(即我从父进程中 fork 了一个进程。父进程不会等待子进程完成,它只是在子进程在后台运行时继续接受更多的输入命令。 ) execvp 确实执行了命令,但随后立即给出了段错误。你能帮助我吗?我将发布我认为相关的部分代码。如果您需要了解更多信息,请告诉我,我会相应地编辑我的问题。

while(1){

pid = fork();
if(pid == 0)
executeCommand(info);
else
{
if(info->boolBackground ==1)
{
waitpid(pid , status , WNOHANG);
}
else
wait(NULL);
}

} //Info contains the command to be executed and it's arguments.

这是我的 executeCommand 函数:

void executeCommand(parseInfo * info)
{
FILE *infile, *outfile;
struct commandType * com;
char * cmd;
int i , status;
cmd = (char*)malloc(1024);
strcpy(cmd , info->CommArray[0].command);
if(info->boolOutfile == 1)
{
outfile = fopen(info->outFile, "w");
dup2(fileno(outfile), 1);
}
if(info->boolInfile == 1)
{
infile = fopen(info->inFile, "r");
dup2(fileno(infile), 0);
}
status = execvp(cmd , info->CommArray[0].VarList); //VarList contains the arguments
if(status == -1){
printf("%s\n",strerror(errno));}

exit(0);
}

当我输入命令时:ls &(& 意味着 ls 应该在后台执行。)它 fork 一个子进程,该子进程执行 ls 并打印目录中的文件/目录列表,然后给出段错误。你能发现错误吗?我尝试使用简单的 ls 命令在后台运行 execvp。它还会导致段错误。

最佳答案

是的,正如 Mark Plotnick 在评论中指出的那样,您可能需要 &status。我会使用 &info->status。此外,如果您执行分离作业,则需要维护其信息对象的列表并对它们执行 waitpid 循环:

forall (info in detached_detach_job_list) {
pid = waitpid(info->pid,&info->status,WNOHANG);
if (pid > 0) {
report_status(info);
remove_job_from_list(info);
}
}

希望您为外循环提供的代码片段能做这样的事情。

此外,我可能不会为前景执行“wait(NULL)”。我会像对待独立工作一样对待它。考虑用户执行以下操作的情况:

det1 &det2 &...det9000 &run_long_30_minute_job

因为您的 shell 在前台苦苦等待,它无法在分离的作业完成时获取它们,您最终会遇到僵尸进程。执行列表/循环方法,只是在前台完成之前不给用户提示(例如,它在列表中,只是清除了背景标志的那个)。换句话说,将列表称为 child_list 之类的东西来表示所有子进程,而不仅仅是后台。在外循环中放置一个 sleep 。或者,附加到 SIGCHLD 并进行一次长时间 sleep

关于shell : Execvp prints output and then segmentation fault occurs when executing a background process 的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32936295/

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