리눅스에서 exec 함수와 스레드, 프로세스의 관계, 스레드는 프로세스의 부분집합 인가요?

익명 사용자의 이미지

        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를 실행한 스레드로 복사해 사용하는 것인가요?

스레드는 프로세스의 부분집합 인가요?

jachin의 이미지

fork 는 아래의 과정으로 프로세스 복제를 진행합니다.

1. init 프로세스를 복사하여
2. fork를 호출한 현재 프로세스의 상태를 복사하고,
3. 호출했던 프로세스의 ID를 새로운 프로세스의 부모 프로세스 ID로 설정하면서,
4. 호출한 프로세스에 자식 프로세스값을 반환해줍니다. 반대로 자식프로세스의 fork 에선 0을 반환합니다.

스레드는 스레드를 생성한 프로세스의 자원을 공유합니다. 스레드가 프로세스의 부분집합이냐는 질문은 이해하기 어려운 질문입니다.

익명 사용자의 이미지

저는 글쓴이는 아니지만

테스트로 여러개의 스레드 생성후,

생성된 스레드에서 exec계열의 함수 사용시,

먼저 실행되는 스레드에서만 실행 되고 나머지 스레드에서는 동작 하지 않네요.

굼금하네요..

글쓴이의 이미지

a.out

int main(int argc, char* argv[])
{
	while (true) cout << argv[1] << endl;
}

void g(string k)
{
	int pid = fork();
	if (pid == 0) execl("a.out", "a.out", k.c_str(), 0);
}
 
int main(int argc, char* argv[])
{
	thread aa[4];
	for (int i = 0; i < 4; ++i)
	{
		aa[i] = thread(g, to_string(i));
	}
	while (true) cout << "MAIN" << endl;
	return 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
1
2
3
0
MAIN

이거 말씀하시는 건가요?
저는 잘 작동 됩니다.

익명 사용자의 이미지

저는 C로 작성을 했지만 동작에는 큰 차이 없어 보이느데 참이상하네요..

궁금증만 더 생기네요... ㅡ.ㅡ;

#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
 
void *func(void *data)
{
        pid_t pid;
        pthread_t tid;
 
        pid=getpid();
        tid=pthread_self();
        char* thread_name = (char*)data;
 
        printf("[%s] pid:%u, tid:%x\n", thread_name, (unsigned int)pid, (unsigned int)tid);
 
        execl("/bin/echo", "/bin/echo","Hi!!", NULL);
}
 
int main()
{
        pthread_t p_thread[2];
        int status;
 
        char p1[]="thread_1";
        char p2[]="thread_1";
 
        if((pthread_create(&p_thread[0],NULL,func,(void *)p1))<0)
        {
                printf("thread error.\n");
                return -1;
        }
 
        if((pthread_create(&p_thread[1],NULL,func,(void *)p2))<0)
        {
                printf("thread error.\n");
                return -1;
        }
 
        pthread_join(p_thread[1],(void **)&status);
        pthread_join(p_thread[0],(void **)&status);
 
        return 0;
 
}

출력결과 :

[thread_1] pid:19199, tid:49365700
Hi!!

익명 사용자의 이미지

https://kldp.org/comment/628705#comment-628705

흠... 같은 이야기를 반복하고 계시는군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.