多任务处理
- 一般来说,多任务处理指的是同时进行几项独立活动的能力
- 多任务处理是所有操作系统的基础,也是并行编程的基础
进程的概念
- 操作系统是一个多任务处理系统。在操作系统中,任务也称为进程
- 进程的正式定义:进程是对映像的执行
- 用一个简单的PROC结构体来表示进程
- typedef struct proc{
struct proc *next;
int *ksp;
int oid;
int ppid;
int status;
int priority;
int kstack[1024];
}PROC;
- typedef struct proc{
- next是指向下一个PROC结构体的指针用于在各种动态数据结构中维护PROC结构体
- ksp字段是保存的堆栈指针
- pid是标识一个进程的进程ID编号
- ppid是父进程ID编号
- status是进程的当前状态
- priority是进程调度优先级
- kstack是进程执行时的堆栈
sh模拟器
- 本编程项目是编写一个c语言程序来模拟Linux sh实现对命令的执行。目标是让读者理解Linux sh如何工作。使用了fork().,esec(),,close(),exit(),pipe()系统调用和字符串操作。
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MAX_CMD_LEN 1024
#define MAX_ARGS 64
void execute_command(char *command) {
char *args[MAX_ARGS];
char *token = strtok(command, " ");
int i = 0;
while (token != NULL && i < MAX_ARGS) {
args[i] = token;
token = strtok(NULL, " ");
i++;
}
args[i] = NULL;
int pipefd[2];
pipe(pipefd);
pid_t pid = fork();
if (pid == 0) {
// 子进程
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
close(pipefd[1]);
execvp(args[0], args);
perror("execvp");
exit(1);
} else if (pid > 0) {
close(pipefd[1]);
wait(NULL);
char buffer[1024];
int nbytes = read(pipefd[0], buffer, sizeof(buffer));
if (nbytes > 0) {
buffer[nbytes] = '\0';
printf("%s", buffer);
}
close(pipefd[0]);
} else {
perror("fork");
}
}
int main() {
while (1) {
char command[MAX_CMD_LEN];
printf("Enter a command (or 'exit' to quit): ");
if (fgets(command, sizeof(command), stdin) == NULL) {
break;
}
command[strcspn(command, "\n")] = '\0';
if (strcmp(command, "exit") == 0) {
break;
}
execute_command(command);
}
return 0;
}
苏格拉底挑战