리눅스에서 exec 함수와 스레드, 프로세스의 관계, 스레드는 프로세스의 부분집합 인가요?
글쓴이: 익명 사용자 / 작성시간: 화, 2018/11/13 - 3:15오후
auto i = thread([]() { int pid = fork(); if (pid == 0) { execl("/bin/ls", "ls", "-a", 0); } }); while (true) cout << "MAIN" << endl; return 0;
에서는 잘 작동하지만
auto i = thread([]() { execl("/bin/ls", "ls", "-a", 0); }); while (true) cout << "MAIN" << endl; return 0;
는 잘 작동하지 않습니다.
exec는 프로세스를 대체하는 것으로 알고있습니다.
fork는 호출된 스레드를 복사하는 것으로 알고있습니다.
첫번째 코드에서는 i 스레드에서 fork후 i스레드를 복사한 후 exec으로 프로세스를 대체하였습니다.
두번째 코드에서는 i 스레드에서 바로 exec으로 프로세스를 대체하였습니다.
그럼 fork는 프로세스를 만들되 메인 스레드를 fork를 실행한 스레드로 복사해 사용하는 것인가요?
스레드는 프로세스의 부분집합 인가요?
Forums:
fork 는 호출한 스레드를 복사하는 것이 아닌...
fork 는 아래의 과정으로 프로세스 복제를 진행합니다.
1. init 프로세스를 복사하여
2. fork를 호출한 현재 프로세스의 상태를 복사하고,
3. 호출했던 프로세스의 ID를 새로운 프로세스의 부모 프로세스 ID로 설정하면서,
4. 호출한 프로세스에 자식 프로세스값을 반환해줍니다. 반대로 자식프로세스의 fork 에선 0을 반환합니다.
스레드는 스레드를 생성한 프로세스의 자원을 공유합니다. 스레드가 프로세스의 부분집합이냐는 질문은 이해하기 어려운 질문입니다.
저는 글쓴이는 아니지만
저는 글쓴이는 아니지만
테스트로 여러개의 스레드 생성후,
생성된 스레드에서 exec계열의 함수 사용시,
먼저 실행되는 스레드에서만 실행 되고 나머지 스레드에서는 동작 하지 않네요.
굼금하네요..
저는 잘 작동합니다.
a.out
MAIN
1
2
3
0
MAIN
1
2
3
0
MAIN
1
2
3
0
MAIN
1
2
3
0
MAIN
1
2
3
0
MAIN
1
2
3
0
MAIN
이거 말씀하시는 건가요?
저는 잘 작동 됩니다.
저는 C로 작성을 했지만 동작에는 큰 차이 없어
저는 C로 작성을 했지만 동작에는 큰 차이 없어 보이느데 참이상하네요..
궁금증만 더 생기네요... ㅡ.ㅡ;
출력결과 :
[thread_1] pid:19199, tid:49365700
Hi!!
https://kldp.org/comment
https://kldp.org/comment/628705#comment-628705
흠... 같은 이야기를 반복하고 계시는군요.
댓글 달기