4

这是作业

嘿伙计们,这是我现在正在处理的任务的一部分:

使用 & 在后台执行的带有或不带参数的命令。
为简单起见,假设 & 总是最后一行。
示例:vi &
详细信息:在这种情况下,您的 shell 必须执行命令并立即返回,在命令完成之前不会阻塞。必须区分不需要交互式输入的进程和需要交互式输入的进程,例如 who 命令与 vi 命令。
概念:后台执行、信号、信号处理程序、进程组、异步执行。系统调用:sigset()、sigaction() 信号:SIGTTOU

所以我们正在用 C 编写我们的“自己的 shell”,而我现在编写的代码运行良好。这里有一些片段,所以你可以看到我在做什么:

// Check for ampersand
block = (ampersand(args) == 1);

& 号函数根据我的调试语句正常工作并返回。这是我几乎肯定我实际上必须做后台代码的地方,我在这里寻求帮助:

// Wait for the child process to complete, if necessary
  if(block) {
//If this executes, there IS an ampersand, and should be backgrounded
    printf("Waiting for child, pid = %d\n", child_id);
    result = waitpid(child_id, &status, 0);
  } else {
  //If this gets executed, there is no ampersand, and should not be backgrounded
    result = waitpid(child_id, &status, 0);
  }

所以现在我可以输入“ls -l &”,它会执行 ls -l 命令,然后执行 printf 语句。所以这很好。如果我不把 & 放在那里,它就不会执行 printf。也很好。

百万美元的问题: 一旦我点击了 printf 语句,那我应该怎么做?请注意,这是一门入门课程,除了我已经编写的代码之外,我知道的不多。我的意思是,我知道 C,但 Unix 对我来说很陌生。

在此先感谢,如果需要,我会提供更多详细信息:)

4

1 回答 1

2

假设我有一个function exec_cmd_with_child(\*params*\),它将负责执行带有适当参数的命令。此函数需要从 if 和 else 中调用。

我们唯一的区别是。在里面if(block)你不会调用等待,因为父进程不应该等待命令执行。而在里面else你将不得不调用等待,这意味着父级将等到命令执行并且不会要求下一个命令。

好吧,如果您想在前台恢复进程,有很多事情需要处理,但如果没有要求,那么您就可以开始了。

于 2013-09-30T17:55:52.067 回答