gpt4 book ai didi

c - 使用 waitpid 在后台运行进程?

转载 作者:太空狗 更新时间:2023-10-29 17:10:06 24 4
gpt4 key购买 nike

如果在命令末尾发现“&”,我正在尝试模仿在后台运行进程的 bash 功能。我有以下功能......但我不认为它在做我想让它做的事情

int execute(char* args[],int background,int *cstatus){
pid_t child;
pid_t ch; /*Pid of child returned by wait*/
if ((child = fork()) == 0){ /*Child Process*/
execvp(args[0],args);
fprintf(stderr, "RSI: %s: command not found\n",args[0]); /*If execvp failes*/
exit(1);

}else{ /*Parent process*/
if (child== (pid_t)(-1)) {
fprintf(stderr,"Fork failed\n"); exit(1);
}else{
if (background==0){ /*If not running in background..wait for process to finish*/
ch = wait(cstatus);
}else{
printf("%ld Started\n",(long)getpid());
/* printf("Parent: Child %ld exited with status = %ld\n", (long) ch, (long)cstatus);
*/ }}
}
return 0;
}
int wait_and_poll(int *cstatus){
pid_t status;
status = waitpid(-1,cstatus,WNOHANG);
if (status>0){
fprintf(stdout,"%ld Terminated.\n",(long) status);
}
return 0;
}

如果我只是运行“ls -l”,它会按预期工作..但是如果我想在后台运行 ls..并让程序继续接受新命令,我调用函数并将背景标志设置为 1 并且我想让它在后台运行进程,告诉我它已经创建了进程..然后提示接受下一个命令。

最佳答案

我认为 waitpid(-1, &cstatus, WNOHANG); 不会像您认为的那样。您需要检查它的返回值。如果是> 0,就是已经退出的子进程的PID。如果它是 0-1,则没有子进程更改状态。

您可以在运行的每个命令之前和/或之后调用 waitpid(-1, &cstatus, WNOHANG);。在循环中调用它以捕获多个子导出。

您还可以处理 SIGCHILD。您的进程将在子进程退出后立即收到此信号,如果您想立即报告子进程终止而不等待用户输入,这很好。

关于c - 使用 waitpid 在后台运行进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14548367/

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