#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/resource.h>
#include <sched.h>
volatile sig_atomic_t priority_change = 0;
void handle_signal(int sig) {
if (sig == SIGINT) priority_change = 1;
else if (sig == SIGTSTP) priority_change = -1;
}
void print_info( char *name) {
int policy = sched_getscheduler(0); // 0 琛ㄧず褰撳墠杩涚▼
printf("%s PID: %d, priority: %d, policy: %d\n",
name, getpid(), getpriority(PRIO_PROCESS, 0), policy);
}
void adjust_priority( char *name) {
if (!priority_change) return;
int new_nice = getpriority(PRIO_PROCESS, 0) + priority_change;
if (setpriority(PRIO_PROCESS, 0, new_nice) == -1) {
perror("setpriorityError");
} else {
printf("%s: priority%s1,current priority: %d\n",
name, priority_change > 0 ? "+" : "-", new_nice);
}
priority_change = 0;
}
int main() {
signal(SIGINT, handle_signal);
signal(SIGTSTP, handle_signal);
if (fork() == 0) {
while (1) {
print_info("child");
adjust_priority("child");
sleep(1);
}
} else {
while (1) {
print_info("parent");
adjust_priority("parent");
sleep(1);
}
}
return 0;
}
Makefile
cc = gcc
CFLAGS = -Wall -g
TARGET = prac3
SRCS = prac3.c
all: $(TARGET)
$(TARGET): $(SRCS)
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS)
clean:
rm -f $(TARGET)