1 Star 0 Fork 0

冰雪不语 / iceshell

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
jobs.c 1.75 KB
一键复制 编辑 原始数据 按行查看 历史
冰雪不语 提交于 2015-05-09 23:40 . 增加后台功能
#include "jobs.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "extern.h"
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void ctrl_z(int sig)
{
NODE *pi=NULL;
pi=(NODE *)malloc(sizeof(NODE)) ;
pi->num=NUM;
pi->pid=PID;
strcpy(pi->state,"stopped");
strcpy(pi->jcmd," ");
head=jobs_link(pi);
kill(PID, SIGSTOP);
}
NODE *jobs_link(NODE *pi)
{
NODE *pf,*pb;
pb=head;//将后台运行程序列表的头指针保存下来
if(head == NULL) {//情况一:列表中没有后台进程执行
NUM=pi->num;
head=pi;
pi->next=NULL;//创建列表并且保存在全局变量head中
} else {//情况二:将新的后台执行的进程添加到列表中
while(pb->next != NULL) {//循环遍历列表直到列表的最后一项
pf=pb;
pb=pb->next;
}
NUM=pi->num;
pb->next=pi;
pi->next=NULL;//将新的后台执行的进程添加到列表中
}
NUM++;
return (head);
}
void output_jobs()
{
NODE *p;
p=head;
if(head != NULL) {
do {
printf("[%d] %d %s %s\n",p->num,p->pid,p->state,p->jcmd);
p=p->next;
}while(p != NULL);
}
else
printf("no jobs in list!\n");
}
void fg_jobs()
{
int num;
NODE *p=NULL;
pid_t pid=0;
p=head;
if(cmd[0].args[1] != NULL) {
sscanf(cmd[0].args[1],"%d",&num);
if(p == NULL) {
printf("no jobs!!\n");
}
while(p != NULL) {
if(num == p->num) {
pid=p->pid;
break;
}
p=p->next;
}
kill(pid,SIGCONT);
waitpid(pid,NULL,WUNTRACED);
}
}
void bg_jobs()
{
int num;
NODE *p=NULL;
pid_t pid=0;
p=head;
if(cmd[0].args[1] != NULL) {
sscanf(cmd[0].args[1],"%d",&num);
if(p == NULL) {
printf("no jobs!!\n");
}
while(p != NULL) {
if(num == p->num) {
pid=p->pid;
break;
}
p=p->next;
}
kill(pid,SIGCONT);
}
}
C
1
https://gitee.com/icemute/iceshell.git
git@gitee.com:icemute/iceshell.git
icemute
iceshell
iceshell
master

搜索帮助