《信息安全系统与设计》第七周学习笔记

发布时间 2023-10-21 19:24:24作者: 20211328-张树杰

多任务处理

  • 一般来说,多任务处理指的是同时进行几项独立活动的能力
  • 多任务处理是所有操作系统的基础,也是并行编程的基础

进程的概念

  • 操作系统是一个多任务处理系统。在操作系统中,任务也称为进程
  • 进程的正式定义:进程是对映像的执行
  • 用一个简单的PROC结构体来表示进程
    • typedef struct proc{
      struct proc *next;
      int *ksp;
      int oid;
      int ppid;
      int status;
      int priority;
      int kstack[1024];
      }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;
}

苏格拉底挑战