关于在我的虚拟shell中使用fork()和子进程的后台进程
我正在尝试在C中创建一个简单的shell程序.我需要做的是为用户提供一个可以运行其他本地程序的提示.我可以使用父进程等待()在孩子上的fork()和孩子execvp()的程序来做到这一点.
但是,如果’&’字符附加到用户命令的末尾,我需要他们的程序在后台运行,这意味着我需要父进程不要等待子进程,而是立即将提示返回给用户,同时允许后台进程继续运行,但不允许它在屏幕上显示任何东西.我只想通过ps命令检查它是否仍然存在. 我试图理解使用fork()创建一个孩子的想法,然后再次使用子进程fork()创建一个子孙,然后立即退出() – 子进程.即孤儿的孙子.假设这允许父母仍然等待孩子,但是由于孩子几乎立即有效地结束,就像它不等待一样?关于僵尸疯狂?我不知道.我遇到的几个网站似乎推荐这个作为在后台运行流程的一种方式. 然而,当我尝试这样做时,我会发现程序流动发生的事情,“背景”过程继续在屏幕上显示输入,我真的不知道从哪里去. 这是我的代码实现,我相信这是错误的.我只是想知道这个整个孙子的事情是否也是我需要采取的路线,如果是,我的代码怎么了? 36 int main(int argc,char *argv[]) 37 { 38 char buffer[512]; 39 char *args[16]; 40 int background; 41 int *status; 42 size_t arg_ct; 43 pid_t pid; 44 45 while(1) 46 { 47 printf("> "); 48 fgets(buffer,512,stdin); 49 parse_args(buffer,args,16,&arg_ct); 50 51 if (arg_ct == 0) continue; 52 53 if (!strcmp(args[0],"exit")) 54 { 55 exit(0); 56 } 57 58 pid = fork(); //here I fork and create a child process 61 62 if (pid && !background) //i.e. if it's the parent process and don't need to run in the background (this is the part that seems to work) 63 { 64 printf("Waiting on child (%d).n",pid); 65 pid = wait(status); 66 printf("Child (%d) finished.n",pid); 67 } 68 else 69 { 70 if (background && pid == 0) { //if it's a child process and i need to run the command in background 71 72 pid = fork(); //fork child and create a grandchild 73 if (pid) exit(0); //exit child and orphan grandchild 74 75 execvp(args[0],args); //orphan execs the command then exits 76 exit(1); 77 78 } else exit(0); 79 } 80 } 81 return 0; 82 } 附:要清楚,我需要我在后台运行的过程,不要再发出声音,即使它有一个无限循环的打印语句或一些东西.我只是想确保它仍然在后台通过ps -a或某些东西运行. 对不起,令人困惑的解释,我只是不知道如何解释它更好. 提前致谢 P.P.S我将实现它,以便每个后续的命令将确定“背景”的布尔值,对于混淆抱歉
你不想在shell中使用double-fork()方法 – 也就是写入守护进程,这个守护程序特别想要由运行它们的shell从监视中转义.
相反,重复&在现有的shell中是调用fork(),然后在child调用setpgid(0,0);把孩子变成一个新的过程组.父母继续(可能在打印孩子的PID后) – 它不调用wait(). 每个终端只能有一个前台进程组,这是当前允许向终端发送输出的进程组.这将保持您的shell是其成员的进程组,因此您的shell将保留在前台. 如果后台进程组尝试从终端读取,将发送一个信号来停止它.仍然允许输出到终端 – 这是正常的(尝试在常规shell中使用ls&).要在shell中实现fg命令,您需要使用tcsetpgrp()函数来更改前台进程组. 您也可以定期通过WNOHANG选项调用waitpid(),即在显示shell提示之前立即.这将允许您检测后台进程何时退出或停止(或者您可以处理SIGCHLD信号). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- bash – 使用变量提供密码成为Jenkins中的sudo用户
- Yum升级mysql5.1到5.6
- Advanced Programming in UNIX Environment Episode 11
- Angular2 transclusion – 将css应用于子元素类
- bootstrap学习笔记心得1
- angularjs – 错误:错误:在角度js中找不到模块?
- BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及
- shell script中的 ${a}和$a有什么区别?
- 模板 – Scala模板中的Playframework 2.X和Date格式
- angularjs事件指令--ngClick、ngDbclick、ngCut、ngChange、