⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jobs.c

📁 一个实现基本功能的shell命令解释器
💻 C
字号:
#include "myfun.h"struct job{	int num[MAX/8];	int pid_num[MAX/8];	char status[MAX/8][50];	char name[MAX/8][50];};extern pid_t pid;extern int status;char p_name[MAX/8];int s_i, p_i;struct job myjob;void sig_child(){	strcpy(myjob.status[p_i], "Hold");}void ctrl_z(){	strcpy(myjob.status[s_i], "Stopped");	printf("[%2d]\t%s\t\t%s\n", s_i, myjob.status[s_i], myjob.name[s_i]);//	return;}void show_job(){	int i;	printf("Num\tStatus\tID\tName\n");	for(i=1; i<=s_i; i++)	{		printf("[%2d]\t%s\t%ld\t%s\n", myjob.num[i], myjob.status[i]				   				     ,myjob.pid_num[i], myjob.name[i]);	}}void jobs(char *buf_in){	signal(SIGTSTP, ctrl_z);	signal(SIGCHLD, sig_child);	char buf[MAX/8]="";	strcpy(buf, buf_in);	if(strncmp(buf, "./", 2) == 0)	{		s_i += 1;		strcpy(myjob.name[s_i], buf);		myjob.num[s_i] = s_i;		strcpy(myjob.status[s_i], "Running");		if((pid=fork()) < 0)		{			printf("fork error!\n");			exit(1);		}		else if(pid==0)		{			execlp(buf,buf,NULL);			printf("couldn't execute: %s\n", buf);			exit(1);		}		else		{			myjob.pid_num[s_i] = pid;			waitpid(pid,&status,WUNTRACED);				strcpy(myjob.status[s_i], "Stopped");		}	}	else if(strncmp(buf, "fg", 2) == 0)	{		if(strlen(buf) < 3)			return;		printf("Call to fg!\n");		s_i = atoi(strrchr(buf, ' '));		pid = myjob.pid_num[s_i];		strcpy(myjob.status[s_i], "Running");		kill(pid,SIGCONT);		waitpid(pid,&status,WUNTRACED);	}	else if(strncmp(buf, "bg", 2) == 0)	{		if(strlen(buf) < 3)			return;		p_i = atoi(strrchr(buf, ' '));		pid = myjob.pid_num[s_i];		printf("Wake up child!\n");		strcpy(myjob.status[s_i], "Running");		kill(pid,SIGCONT);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -