프로세스수행중간에 다른 프로세스 실행하는 방법을 알고 싶습니

vhfpss의 이미지

이번에 검사점 복구기법에 관련된 프로그램을 분석 및 약간 수정하려구 합니다. 이 프로그램의 기본원리는 보통 우리가 흔히 쓰는 한글 문서편집기나 마이크로 워드와 같이 갑자기 발생하는 소프트웨어적인 에러나 하드웨어적인 에러로 인해 작업의 손실을 가져오는것을 막기위해 수행 중간 중간에 대상 프로세스의 작업내용을 저장하여 복구함으로써 다시 처음부터 작업을 해야하는 번거러움과 피해를 줄이기위한 프로그램입니다.
이것을 약간 변경하여 복구프로세스가 모든 프로세스를 감시하면서 저장하는 방식으로 변경하려 하는데 문제가 복구프로세스가 대상 프로세스를 수행시킨 후에 대상 프로세스를 중간에 재우거나 대기상태로 돌려놓은 다음에 그 대상 프로세스의 작업내용을 저장(task정보, 메모리 정보등등...)한 후 다시 대상프로세스가 남은 작업을 수행하도록 하기위한 방법을 강구중입니다.

문제는 그 대상 프로세스를 어떻게 잠깐 중지시키고 내용을 저장하느냐 하는 것입니다. sleep()함수나 타이머 인터럽트 방식을 사용해야 하는지 스케줄링을 해야하는지 알수가 없네요.

전 초보라 아직은 잘 모르지만 많은 고수분들의 도움을 받으면 해결할수 있을것 같아서 이렇게 글을 올립니다. 부디 많은 조언 부탁드립니다..^^

서지훈의 이미지

이건 signal과 forking 을 이용하면은 될것 같군요...
에러가 나는 부분에 어떤 signal이 뜨는지 확인을 한 다음에...
그 signal에 대한 처리만 해주면은 원하시는 방향으로 해결이 되지 않을까 생각이 드네요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

vhfpss의 이미지

답변에 감사드립니다.^^;;
그런데 제가 문제의 요지를 정확히 밝히지 않아 조금은 잘못 알고 계신것 같아
지금 다시 편집해서 올렸습니다.
번거로우시더라두 한번 보시구 해결책을 말해주셨으면 합니다...^^
님의 성의 있는 답변에 감사 드립니다...좋은 하루 되세요..^^

하루 하루가 즐겁게 웃을 수 있는 날이길 바라며...

서지훈의 이미지

이런 작업이라면...
IPC 중에... semaphore를 사용하시면은 원하시는 결과를 얻으실것 같군요...
semaphore 부분을 찾아서 한 번 보시길...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

vhfpss의 이미지

옙...님의 말처럼 한번 찾아볼께요..^^;
답변에 감사드립니다...

님의 앞길에 언제나 행복이 가득 하시길...

하루 하루가 즐겁게 웃을 수 있는 날이길 바라며...

moonzoo의 이미지

1. fork를 통해 자식 프로세스 생성.
2. waitpid를 통해 자식 프로세스 상태 감지..( 블록킹..)
4. 자식 프로세스는 고유의 업무 시작.
5. SIGSTOP signal 을 =====> 자식프로세스 에게 전달.
6. 자식 프로세스는 일시 중단.
7. 부모 프로세스는 이때 waitpid을 통해 자식이 중단되었음을 감지하고
업무 수행..(자식 정보를 수집하는 등의..)
다시 waitpid..
8. SIGCONT signal 을 =====> 자식프로세스 에게 전달.
9. 자식 프로세스는 다시 깨어나서 고유의 업무 시작.

대강 이런식으로 구현하면 되겠습니다.
5, 8 번의 signal을 보내는 부분은 부모가 해도 될테고,
임의의 제 3 프로세스가 해도 무방합니다...

간단한 소스를 만들어 보았습니다.

#include <stdio.h>
#include <sys/errno.h>
#include <sys/wait.h>

int main()
{
    int i;
    int pid;
    int status;

    pid = fork();
    if( pid < 0 ) fprintf(stderr,"\nfork error");
    if( pid == 0)
    {
        while(1)
        {
            printf("\nchild : [job%d]",i++);
            sleep(2);
        }
        return 0;
    }
    if( pid > 0)
    {
        while(1)
        {
            printf("\nparent: wait..");
            while( waitpid(pid, &status, WUNTRACED) < 0)
            {
                if( errno != EINTR)
                {
                    status = -1;
                    break;
                }
            }
            if( status < 0) break;
            printf("\nparent: save child[%d] information[%d]",pid,status);
            sleep(1);
        }
    }

    return 0;
   
}

위의 소스를 실행시키고 , 자식 프로세스에게 SIGSTOP, SIGCONT 등의

signal을 보내주면(kill 이용..) 대강의 동작을 파악할 수 있을 겁니다.

vhfpss의 이미지

덕분에 정말 쉽게 문제를 해결할수 있게 되었습니다.
정말 고수시네요..^^;;
님 덕분에 일찍 끝낼수 있을껏 같습니다...
좋은 답변 감사드리구여...앞으로도 앞일에 항상 행복이 가득하길 빌어요..^^;;

하루 하루가 즐겁게 웃을 수 있는 날이길 바라며...

댓글 달기

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