60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
#ifndef _JOB_H_
|
|
#define _JOB_H_
|
|
|
|
#include <sys/types.h>
|
|
|
|
#define MAX_ARGS 64
|
|
|
|
// [1단계] 단일 명령어 (Simple Command)
|
|
// 예: "grep error > log.txt"
|
|
typedef struct command_t {
|
|
char *argv[MAX_ARGS]; // 인자 리스트 (예: {"grep", "error", NULL})
|
|
int argc; // 인자 개수
|
|
|
|
char *input_path; // 리다이렉션 < (없으면 NULL)
|
|
char *output_path; // 리다이렉션 > (없으면 NULL)
|
|
int append_mode; // >> 모드 여부 (0 or 1)
|
|
|
|
struct command_t *next; // 파이프라인의 다음 명령어 (Linked List)
|
|
} command_t;
|
|
|
|
// [2단계] 작업 상태 (Job State)
|
|
typedef enum {
|
|
JOB_RUNNING, // 실행 중
|
|
JOB_STOPPED, // 정지됨 (Ctrl+Z)
|
|
JOB_DONE // 완료됨
|
|
} job_state_t;
|
|
|
|
// [3단계] 작업 (Job) - 파이프라인 전체를 하나의 작업으로 봄
|
|
// 예: "ls | grep c &"
|
|
typedef struct job_t {
|
|
int id; // Job ID (쉘이 관리하는 번호: 1, 2, 3...)
|
|
pid_t pgid; // Process Group ID (이 작업의 대표 PID)
|
|
job_state_t state; // 현재 상태
|
|
int is_bg; // 백그라운드 실행 여부 (1=BG, 0=FG)
|
|
char *command_line; // 원본 명령어 문자열 (jobs 출력용)
|
|
|
|
command_t *head; // 명령어 리스트의 첫 번째 (ls)
|
|
|
|
struct job_t *next; // 다음 작업 (Job List용)
|
|
} job_t;
|
|
|
|
// --- 함수 원형 ---
|
|
|
|
// Job 관리
|
|
void init_job_list();
|
|
job_t *create_job(char *line);
|
|
void add_job(job_t *job);
|
|
int delete_job(pid_t pgid);
|
|
job_t *find_job(pid_t pgid);
|
|
job_t *find_job_by_id(int id);
|
|
void free_job(job_t *job);
|
|
|
|
// Command 관리
|
|
void append_command(job_t *job, command_t *cmd);
|
|
void free_command(command_t *cmd);
|
|
|
|
// 전역 변수 (외부에서 접근 가능)
|
|
extern job_t *job_list_head;
|
|
|
|
#endif |