execl()사용하면 process가 죽어요
글쓴이: study / 작성시간: 목, 2017/03/02 - 12:54오후
아래와 같은 code를 만들어 봤습니다.
목적은 main()에서 child process를 fork하고,
parent process와 child process는 loop를 돌면서
/bin/ls 를 5초 마다 출력하는 건데요.
#include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/types.h> #include <errno.h> #include <error.h> void child(int socket) { int err; const char hello[] = "hello parent, I am child"; write(socket, hello, sizeof(hello)); while(1) { printf("in child\n"); execl("/usr/bin/ls", "/usr/bin/ls", "-l", NULL); sleep(5); } } void parent(int socket) { char buf[1024]; int n = read(socket, buf, sizeof(buf)); printf("parent received '%.*s'\n",n, buf); while(1) { printf("in parent\n"); // execl("/usr/bin/ls", "ls", "-la", NULL); sleep(5); } } int main(void) { int fd[2]; static const int parentsocket = 0; static const int childsocket = 1; pid_t pid; socketpair(AF_UNIX, SOCK_STREAM, 0, fd); pid = fork(); if (pid == 0) { close(fd[parentsocket]); child(fd[childsocket]); } else { close(fd[childsocket]); parent(fd[parentsocket]); } exit(0); }
위의 code를 실행하면 출력이 아래와 같습니다.
child process는 execl를 실행하자마자 종료되어 버린것 같아요
종료되지 않고, 계속 loop를 돌면서 ls를 실행하려면
어떻게 해야하는 건지요?
in child parent received 'hello parent, I am child' in parent total 44 -rwxrwxr-x 1 study study 8964 Mar 1 20:14 a.out -rw-rw-r-- 1 study study 1029 Feb 21 18:08 list.dat -rw-rw-r-- 1 study study 385 Feb 8 18:51 my_list.c -rw-rw-r-- 1 study study 44 Feb 8 18:54 phonebook.txt -rw-rw-r-- 1 study study 953 Mar 1 22:32 process_test.c -rwxrwxr-x 1 study study 9116 Mar 1 22:32 ptest -rw-rw-r-- 1 study study 503 Feb 8 20:14 test.c in parent in parent in parent in parent in parent in parent in parent in parent in parent in parent in parent
Forums:
음 ..
exec 계열 함수들은 프로세스의 이미지를 새로운 프로세스 이미지로 바꿉니다.
즉, exec 이 호출되는 순간, 완전히 새로운 프로세스로 바뀌기 때문에..
exec 이후의 코드들은 exec 자체가 실패했을 때를 제외하고는 아무런 의미가 없습니다.
child 에서 뭔가 주기적으로 작업하기를 바란다면, exec 대신 system 함수로 바꾸는게 편할겁니다.
아니면 다시 child 에서 fork & exec 하게 만들어야 하는데.. 어차피 그게 system 함수와 같습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
넵.. 그냥 system 함수 쓰세요.
system("/usr/bin/ls");
아주 간단하니 좋네요.
PID가 필요한데요..
system()을 써도 좋고, fork, exec을 써도 좋은데요.
그런함수들을 이용해서 실행시키는 process의 PID를 읽고 싶은데요.
system()을 쓰면, system()을 이용해서 실행하는 program의 process ID를
어떻게 읽어오는지요?
그러면 뭐 달리 선택의 여지가 없습니다.ls를
그러면 뭐 달리 선택의 여지가 없습니다.
ls
를 실행시킬 쪽에서 fork를 한 번 더 하는 수밖에요.댓글 달기