쓰레드 안에서 fork 사용 관련해서 질문드립니다...

bao의 이미지

qt 로 프로그래밍을 하다가 질문드립니다.


다이얼로그 기반에서 버튼 하나를 만들고 버튼을 누를경우

쓰레드를 하나 만들고 그 쓰레드 안에서

fork를 프로세스를 만든 다음에

pid = fork();
if (pid > 0)
{
    execv("프로그램 경로", argv);
}

이런식으로 다른 프로그램을 실행 시켰더니

 
QObject::killTimers: timers cannot be stopped from another thread

위의 내용과 함께 fork시킨 프로세스에서 실행한 프로그램만 실행이 되고

다이얼로그는 종료가 되어버립니다.

다이얼로그를 종료 시키면 안되는데 어떤식으로 프로그램을 만들어야 하는건가요??

 
void Dialog::on_pushButton_clicked()
{
    pthread_t pThread;
    int thrId;
 
    thrId = pthread_create(&pThread, NULL, threadStrat, NULL);
 
    pthread_join(pThread, NULL);
    //pthread_detach(pThread);
}
 
void* threadStrat(void* param)
{
    int pid;
    char *argv[20] = {0};
    argv[0] = "파라미터";
 
 
    pid = fork();
    if (pid > 0)
    {
        execv("프로그램경로", argv);
    }
}
라스코니의 이미지

잘 모르겠지만 쓰레드 안에서 fork()를 할 필요가 있나요?
쓰레드를 만들지 말고 그냥 fork()를 하면 안되나요?

bao의 이미지

이걸 가져다 쓰려는 곳이 쓰레드 기반으로 되어있어서...

쓰레드 안에서 꼭 사용을 해야 합니다..

라스코니의 이미지

잘 이해가 되지는 않네요. fork()라는 것은 새로운 프로세스를 만드는 것이잖아요?

만약 쓰레드를 따로 만들어서 fork()를 하지 않으면 어떤 현상이 발생하나요? 프로그램이 죽나요?

그리고 fork()를 하면 자기 자신이 그대로 복제되는 것이기 때문에 타이머 등이 enable 되어 있으면 이중으로 잡혀서 에러가 발생할 수 있을 것 같습니다. 처음 구동시에는 타이머를 enable 하고 있지 않다가 (또는 동적으로 잡아서) fork()를 하고 난 후 enable 하는 식으로 해야 할 것 같습니다.

QTimer *m_timer;
m_timer = new QTimer; 등등

nhlsm의 이미지

프로그램 실행이 목적이라면, QProcess 를 사용하세요

ymir의 이미지

fork() 를 한 이후에 pid > 0 이라면, 이는 parent process 입니다.
여기에서 exec() 을 하면, parent process 가 새 프로그램으로 대체되겠죠.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.