但是,如果’&’字符附加到用户命令的末尾,我需要他们的程序在后台运行,这意味着我需要父进程不要等待子进程,而是立即将提示返回给用户,同时允许后台进程继续运行,但不允许它在屏幕上显示任何东西.我只想通过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中是调用fork(),然后在child调用setpgid(0,0);把孩子变成一个新的过程组.父母继续(可能在打印孩子的PID后) – 它不调用wait().
每个终端只能有一个前台进程组,这是当前允许向终端发送输出的进程组.这将保持您的shell是其成员的进程组,因此您的shell将保留在前台.
如果后台进程组尝试从终端读取,将发送一个信号来停止它.仍然允许输出到终端 – 这是正常的(尝试在常规shell中使用ls&).要在shell中实现fg命令,您需要使用tcsetpgrp()函数来更改前台进程组.
您也可以定期通过WNOHANG选项调用waitpid(),即在显示shell提示之前立即.这将允许您检测后台进程何时退出或停止(或者您可以处理SIGCHLD信号).