20#include <sys/socket.h>
30#define NUM_PROCESSES 2
31#define DEFAULT_TCP_PORT 5100
34static void test_smart_pointer();
35static void test_file_reading();
36static void test_multithreading();
37static void test_multiprocessing();
38static void test_synchronization();
39static void run_all_tests();
40static pid_t kernel_fork();
41static void kernel_create_thread(pthread_t *thread,
void *(*start_routine)(
void *),
void *arg);
42static void kernel_join_thread(pthread_t thread);
43static void kernel_socket_communication(
int sock_fd,
const char *message,
char *response,
size_t response_size);
44static void kernel_wait_for_process(pid_t pid);
54static void process_function();
57int main(
int argc __attribute__((unused)),
char** argv __attribute__((unused))) {
62 char buf[] =
"부모 프로세스에서 보냄!", line[BUFSIZ];
66 sem_t* kernel_semaphore;
67 pthread_mutex_t* kernel_mutex;
76 ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, sock_fd);
80 kernel_printf(
"소켓 페어 생성됨: FD1=%d, FD2=%d\n", sock_fd[0], sock_fd[1]);
92 kernel_socket_communication(sock_fd[1], buf, line,
sizeof(line));
103 kernel_join_thread(threads[0]);
110 printf(
"부모 프로세스 시작됨\n");
114 printf(
"부모 프로세스가 자식과 통신 중\n");
115 kernel_socket_communication(sock_fd[0], buf, line,
sizeof(line));
116 printf(
"부모 프로세스에서 받은 메시지: %s\n", line);
118 kernel_wait_for_process(pid);
131 kernel_join_thread(threads[i]);
143 pthread_t sem_threads[2];
144 for (
int i = 0; i < 2; i++) {
147 for (
int i = 0; i < 2; i++) {
148 kernel_join_thread(sem_threads[i]);
153 pthread_t mutex_threads[2];
154 for (
int i = 0; i < 2; i++) {
155 kernel_create_thread(&mutex_threads[i],
mutex_thread, kernel_mutex);
157 for (
int i = 0; i < 2; i++) {
158 kernel_join_thread(mutex_threads[i]);
163 char *invalid_ptr = NULL;
164 if (invalid_ptr == NULL) {
168 FILE *invalid_file = fopen(
"/invalid/path",
"r");
175 pid_t worker_pid = kernel_fork();
176 if (worker_pid == 0) {
182 kernel_wait_for_process(worker_pid);
187 void *memory_block = malloc(1024);
197 int fd = open(
"/dev/null", O_WRONLY);
201 write(fd,
"커널 테스트 데이터", 16);
207 char *test_file_path =
"/tmp/kernel_test_file";
208 FILE *test_file = fopen(test_file_path,
"w");
212 fprintf(test_file,
"커널 테스트 데이터\n");
216 test_file = fopen(test_file_path,
"r");
218 char read_buffer[128];
219 while (fgets(read_buffer,
sizeof(read_buffer), test_file)) {
225 if (remove(test_file_path) == 0) {
239 int syscall_result = getpid();
240 kernel_printf(
"시스템 호출 SYS_getpid 반환값: %d\n", syscall_result);
242 syscall_result = getuid();
243 kernel_printf(
"시스템 호출 SYS_getuid 반환값: %d\n", syscall_result);
264 sem_destroy(kernel_semaphore);
266 pthread_mutex_destroy(kernel_mutex);
273 kernel_printf(
"*************************************************\n");
274 kernel_printf(
"**** log file end *******************************\n");
282static pid_t kernel_fork() {
290static void kernel_create_thread(pthread_t *thread,
void *(*start_routine)(
void *),
void *arg) {
291 int err = pthread_create(thread, NULL, start_routine, arg);
297static void kernel_join_thread(pthread_t thread) {
298 int err = pthread_join(thread, NULL);
307static void kernel_socket_communication(
int sock_fd,
const char *message,
char *response,
size_t response_size) {
308 if (write(sock_fd, message, strlen(message)) == -1) {
312 ssize_t bytes_read = read(sock_fd, response, response_size - 1);
313 if (bytes_read == -1) {
316 response[bytes_read] =
'\0';
319static void kernel_wait_for_process(pid_t pid) {
321 if (waitpid(pid, &status, 0) < 0) {
333static void test_smart_pointer() {
356static void test_file_reading() {
357 FILE *file = fopen(
"non_existent_file.txt",
"r");
366 while (fgets(buffer,
sizeof(buffer), file) != NULL) {
374static void test_multithreading() {
385 pthread_join(threads[i], NULL);
392static void process_function() {
393 pid_t pid = getpid();
400static void test_multiprocessing() {
409static void test_synchronization() {
415 pthread_t sem_threads[2];
416 pthread_t mutex_threads[2];
419 for (
int i = 0; i < 2; i++) {
423 for (
int i = 0; i < 2; i++) {
424 pthread_join(sem_threads[i], NULL);
428 for (
int i = 0; i < 2; i++) {
429 pthread_create(&mutex_threads[i], NULL,
mutex_thread, mutex);
432 for (
int i = 0; i < 2; i++) {
433 pthread_join(mutex_threads[i], NULL);
439 sem_destroy(semaphore);
442 pthread_mutex_destroy(mutex);
448static void run_all_tests() {
449 test_smart_pointer();
451 test_multithreading();
452 test_multiprocessing();
453 test_synchronization();
void kernel_chat(int num_args,...)
네트워크와 클라이언트 간의 채팅 처리 함수
sem_t * init_semaphore(int value)
세마포어 초기화 함수 선언
void kernel_errExit(const char *format,...)
커널 오류 종료 함수 선언
void create_multi_processes(int num_processes,...)
다중 프로세스 생성 함수 선언
void kernel_errMsg(const char *format,...)
커널 오류 메시지 출력 함수 선언
void safe_kernel_printf(const char *format,...)
스레드 안전한 출력 함수 선언
pthread_mutex_t * init_mutex()
뮤텍스 초기화 함수 선언
SmartPtr create_smart_ptr(size_t size,...)
스마트 포인터를 생성하는 함수 (가변 인자 사용)
kernel_printf("5-4 = %d\n", 1)
void run_multithreading(int num_threads, int use_semaphore,...)
멀티스레드 실행 함수 (쓰레드 수 및 동기화 방법을 입력받음)
void * semaphore_thread(void *arg)
세마포어를 사용하는 스레드 작업 함수
int main(int argc __attribute__((unused)), char **argv __attribute__((unused)))
void * thread_function(void *arg)
void * mutex_thread(void *arg)
뮤텍스를 사용하는 스레드 작업 함수