c语言实现shell,其中作业控制和命令捕捉的问题。有偿求助。

V畿 2017-02-16 10:23:04
c语言实现shell,其中作业控制和命令捕捉的问题。

我简单描述下。。就是我这个用c实现了一个简单的shell。内部命令就只有cd exit这种低级的。。然后还要求加一个fg和bg。。其他全部靠外部命令。。。。然后目前我需要完成作业控制这块

具体细节是。。。能捕捉到ctrlz。然后检查当前子进程是否运行。。运行就挂起他。。。同时输出提示。已挂起。。 如果没有运行的进程。。输出提示。无运行进程。。。。

第二个要求就是。加入bg和fg内部命令。。。发sigcont。类似的这样。。但是fg我应该明白。。。但是bg我是。。不太会。。。

如果有哪个大佬能详细描述下怎么做感激不尽。。。。
如果能替我完成。我可以给予800元的酬劳。


我目前的进度是。。fork=0的时候。getpid到子进程的pid。。。用sighandler捕捉到进程。。之后waitpid检查状态。。然后返回0 就发送sigtstp。。不然就提示无运行。。

但是结果不正常。有程序运行的时候永远都是无运行。pid输出为0。 没运行的时候 也提示没运行,但是pid正常。。

...全文
376 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2017-02-28
  • 打赏
  • 举报
回复
捕捉^Z也要自己去模拟么? 现在的shell里,通常把子任务作为tty的前端进程(组),这样^Z会导致子任务stop,进而可以被父进程waitpid检测到,父进程不需要显式的处理^Z(这个逻辑由tty的driver来cover)。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
	printf("old_tty_grp=%d\n", tcgetpgrp(0));
	int pid; 
	if ((pid = fork()) == 0) {
		while (1);
	} else {
		if (0 != setpgid(pid, pid)) return 1;
		if (0 != tcsetpgrp(0, pid)) return 1;
		printf("new_tty_grp=%d\n", tcgetpgrp(0));
		int s, pid = waitpid(-1, &s, WCONTINUED | WUNTRACED);
		printf("wait=%d, status=%x\n", pid, s);
	}
	return 0;
nswcfd 2017-02-28
  • 打赏
  • 举报
回复
可能涉及到tty的一些概念。 简单的话,可以参考busybox的shell实现。
twintiger 2017-02-18
  • 打赏
  • 举报
回复
没有这么麻烦, 用system。 比如命令输入串是cmdbuf="ls", ret = system(cmdbuf); 如果输入串命令是cmdbuf="fg vi",表示直接运行。 你自己parse出cmdbuf="vi", ret=system(cmdbuf); 如果cmdbuf=“bg vi”,表示后台运行,你parse出cmdbuf="vi",这时你要加个&,也就是cmdbuf=“vi&” ret=system(cmdbuf);
混沌鳄鱼 2017-02-16
  • 打赏
  • 举报
回复
百度一下 bash shell 源代码, 然后看看不就行了.

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧