sigemptyset과 setpgid()의 중요성이 궁금합니다.
글쓴이: hyemin1826 / 작성시간: 화, 2020/12/01 - 1:31오전
void eval(char *cmdline) { char *argv[MAXARGS]; int bg; int built_in; pid_t pid; sigset_t *set; bg=parseline(cmdline, argv); if (argv[0]==NULL) return; //blank -> NULL built_in=builtin_cmd(argv);//quit, fg, bg, jbos ->1, otherwise ->0 if (built_in==0){//other command sigemptyset(set); //set==empty set sigaddset(set, SIGCHLD); sigprocmask(SIG_BLOCK, set, NULL); if ((pid=fork())==0){ sigprocmask(SIG_UNBLOCK, set, NULL); setpgid(0, 0); if (execve(argv[0],argv, environ)<0){ printf("%s: Command not found\n", argv[0]); exit(1); } } else { //parent if (bg){ //need to run the command in background addjob(jobs, pid, BG, cmdline); sigprocmask(SIG_UNBLOCK, set, NULL); printf("[%d] (%d) %s", pid2jid(pid), pid, cmdline); } else { //foreground //printf("foreground\n"); addjob(jobs, pid, FG, cmdline); sigprocmask(SIG_UNBLOCK, set, NULL); waitfg(pid); } } } return; }
여기서 sigemptyset이 없으면 어떤 일이 일어날까요? 그리고 setpgid(0,0)은 pid를 pgid로 설정하는 거라고 이해하고 있습니다. 만약 이걸 지정하지 않으면 어떤 일이 벌어지나요?(또 setpgid(0,0)을 parent 부분에 써도 괜찮은 걸까요?)
shell 을 구현하고 있는데 이것저것 헷갈리는 게 많네요...
Forums:
...
일단 sigemptyset을 쓰느냐 안쓰느냐는 둘째치고, set이라는 *포인터* 변수가 랜덤한 메모리 영역을 가리키고 있네요.
C의 포인터 사용법과 C에서 call by reference를 어떻게 구현하는지에 대해 복습을 하시는 게 좋을 것 같습니다.
댓글 달기