linux创建进程 子孙,关于在我的虚拟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我将实现它,以便每个后续的命令将确定“背景”的布尔值,对于混淆抱歉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值