34 va_start(args, format);
36 pthread_mutex_lock(&print_mutex);
37 vprintf(format, args);
39 pthread_mutex_unlock(&print_mutex);
51 pthread_t* threads = (pthread_t*)malloc(num_threads *
sizeof(pthread_t));
53 va_start(args, num_threads);
55 for (
int i = 0; i < num_threads; i++) {
56 void* (*thread_func)(
void*) = va_arg(args,
void* (*)(
void*));
57 int err = pthread_create(&threads[i], NULL, thread_func, NULL);
63 for (
int i = 0; i < num_threads; i++) {
64 pthread_join(threads[i], NULL);
80 }
else if (pid == 0) {
96 va_start(args, num_processes);
98 for (
int i = 0; i < num_processes; i++) {
102 }
else if (pid == 0) {
103 void (*process_func)() = va_arg(args,
void (*)());
109 for (
int i = 0; i < num_processes; i++) {
123 sem_t* sem = (sem_t*)malloc(
sizeof(sem_t));
125 perror(
"세마포어 메모리 할당 실패");
132 snprintf(sem_name,
sizeof(sem_name),
"/semaphore_%d", getpid());
133 sem_unlink(sem_name);
134 sem = sem_open(sem_name, O_CREAT, 0644, value);
135 if (sem == SEM_FAILED) {
136 perror(
"세마포어 초기화 실패 (macOS)");
142 if (sem_init(sem, 0, value) != 0) {
143 perror(
"세마포어 초기화 실패 (Linux)");
158 pthread_mutex_t* mutex = (pthread_mutex_t*)malloc(
sizeof(pthread_mutex_t));
159 if (pthread_mutex_init(mutex, NULL) != 0) {
185 new_node->
data = data;
186 new_node->
next = NULL;
192 list->
tail = new_node;
210 void* data = temp->
data;
213 if (list->
head == NULL) {
230 return list->
size == 0;
250static void terminate(
bool useExit3) {
251 char *s = getenv(
"EF_DUMPCORE");
253 if (s != NULL && *s !=
'\0')
270static void outputError(
bool useErr,
int err,
bool flushStdout,
const char *format, va_list ap) {
273 vsnprintf(userMsg,
BUF_SIZE, format, ap);
276 snprintf(errText,
BUF_SIZE,
" [%s %s]",
277 (err > 0 && err <= MAX_ENAME) ? ename[err] :
"?UNKNOWN?", strerror(err));
281 snprintf(buf,
BUF_SIZE,
"ERROR%s %s\n", errText, userMsg);
298 int savedErrno = errno;
300 va_start(argList, format);
301 outputError(
true, errno,
true, format, argList);
316 va_start(argList, format);
317 outputError(
true, errno,
true, format, argList);
333 va_start(argList, format);
334 outputError(
true, errnum,
true, format, argList);
349 va_start(argList, format);
350 outputError(
false, 0,
true, format, argList);
367 fprintf(stderr,
"Usage: ");
368 va_start(argList, format);
369 vfprintf(stderr, format, argList);
387 fprintf(stderr,
"Command-line usage error: ");
388 va_start(argList, format);
389 vfprintf(stderr, format, argList);
403 sem_t* semaphore = (sem_t*)arg;
412 if(sem_post(semaphore) == -1) {
428 pthread_mutex_t* mutex = (pthread_mutex_t*)arg;
431 pthread_mutex_lock(mutex);
437 if(pthread_mutex_unlock(mutex) != 0) {
454 if (num_threads < 1 || num_threads > 100) {
460 num_threads, use_semaphore ?
"세마포어" :
"뮤텍스");
462 pthread_t* threads = (pthread_t*)malloc(num_threads *
sizeof(pthread_t));
463 int* thread_ids = (
int*)malloc(num_threads *
sizeof(
int));
466 sem_t* semaphore = NULL;
467 pthread_mutex_t* mutex = NULL;
479 va_start(args, use_semaphore);
480 for (
int i = 0; i < num_threads; i++) {
481 thread_ids[i] = i + 1;
489 int err = pthread_create(&threads[i], NULL,
mutex_thread, mutex);
497 for (
int i = 0; i < num_threads; i++) {
498 pthread_join(threads[i], NULL);
504 sem_close(semaphore);
505 sem_unlink(
"/semaphore");
508 sem_destroy(semaphore);
513 pthread_mutex_destroy(mutex);
sem_t * init_semaphore(int value)
세마포어 초기화 함수
void run_multithreading(int num_threads, int use_semaphore,...)
멀티스레드 실행 함수 (쓰레드 수 및 동기화 방법을 입력받음)
void push(LinkedList *list, void *data)
연결 리스트에 요소 추가 함수
void kernel_errExit(const char *format,...)
커널 오류 종료 함수
bool is_empty(LinkedList *list)
연결 리스트가 비었는지 확인하는 함수
void * semaphore_thread(void *arg)
세마포어를 사용하는 스레드 작업 함수
void create_multi_processes(int num_processes,...)
다중 프로세스 생성 함수
void create_threads(int num_threads,...)
스레드 생성 함수
void * pop(LinkedList *list)
연결 리스트에서 요소 제거 함수
void kernel_fatal(const char *format,...)
커널 치명적 오류 함수
void create_single_process(void(*func)())
단일 프로세스 생성 함수
void kernel_errExitEN(int errnum, const char *format,...)
커널 오류 종료 함수 (오류 번호 사용)
void kernel_errMsg(const char *format,...)
커널 오류 메시지 출력 함수
LinkedList * create_linkedlist()
연결 리스트 생성 함수
void safe_kernel_printf(const char *format,...)
스레드 안전한 출력 함수
void kernel_cmdLineErr(const char *format,...)
커맨드 라인 오류 처리 함수
void * mutex_thread(void *arg)
뮤텍스를 사용하는 스레드 작업 함수
void kernel_usageErr(const char *format,...)
커널 사용법 오류 함수
pthread_mutex_t * init_mutex()
뮤텍스 초기화 함수
void destroy_linkedlist(LinkedList *list)
연결 리스트 삭제 함수
kernel_printf("5-4 = %d\n", 1)