Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将fork作为后台进程运行?_C_Fork_Parent Child_Background Process_Child Process - Fatal编程技术网

C 如何将fork作为后台进程运行?

C 如何将fork作为后台进程运行?,c,fork,parent-child,background-process,child-process,C,Fork,Parent Child,Background Process,Child Process,我正在制作一个简单的shell,我需要能够运行一个命令,比如sleep5&。&告诉它作为后台进程运行,这样我就可以在子进程在后台“休眠”时输入其他命令,例如cd someDirectory 我已经对它进行了设置,以便它能够正确地分叉,但是如何设置它,以便在给定&时,它能够在后台运行子级 我对WNHONANG做了很多研究,并做了waitpid(pid,&status,WNHONANG)之类的事情,但这使得它毫无用处 这是我的密码: int executeCommand(char **args){

我正在制作一个简单的shell,我需要能够运行一个命令,比如
sleep5&
&
告诉它作为后台进程运行,这样我就可以在子进程在后台“休眠”时输入其他命令,例如
cd someDirectory

我已经对它进行了设置,以便它能够正确地分叉,但是如何设置它,以便在给定
&
时,它能够在后台运行子级

我对
WNHONANG
做了很多研究,并做了
waitpid(pid,&status,WNHONANG)
之类的事情,但这使得它毫无用处

这是我的密码:

int executeCommand(char **args){
    pid_t pid;
    int status;
    
    pid = fork();
    //error in fork
    if(pid < 0){
        printf("Fork Failed\n");
        exit(1);
    }
    //child process
    if(pid == 0){
        //child executes process
        execvp(args[0], args);
        
        //if execution fails
        exit(1);
    }
    //parent process
    else{
        waitpid(pid, &status, 0);
    }
    //Do I need this?
    kill(pid, SIGKILL);
    return 1;
}

int executeCommand(字符**args){
pid_t pid;
智力状态;
pid=fork();
//叉子错误
if(pid<0){
printf(“Fork失败\n”);
出口(1);
}
//子进程
如果(pid==0){
//子进程执行进程
execvp(args[0],args);
//如果执行失败
出口(1);
}
//父进程
否则{
waitpid(pid和status,0);
}
//我需要这个吗?
kill(pid,SIGKILL);
返回1;
}

不要调用
waitpid
。前景和背景是shell概念,而不是
fork
的固有工作方式。如果在允许下一个命令之前不“等待”子进程退出,那么根据定义,这意味着它正在后台运行。也不要终止进程;)那么,我是否可以去掉最后的
else
语句?然后只需检查子进程是否完成?您可能希望使
else
以命令需要是背景还是前景为条件。然后是的,后台进程有不同的代码来获取任何退出的子进程-这是一个不同的主题,建议您研究如何这样做,并在需要时提出一个新问题。请注意,您需要每隔一段时间使用WNOHANG等待子进程,以防止shell收集僵尸。除了后台处理之外,您还需要仔细考虑如何处理收获(等待)的孩子。