2012-03-07 4 views
2

백그라운드 프로세스에서 실행 한 프로세스 (터미널 유형을 읽고 씁니다)가 있습니다. 나는 ps를 사용하여 그것을 볼 수있다. 포 그라운드로 가져 시도, 이것은 내가 시도한 : 그것은 비록 작동하지 않습니다프로세스를 포 그라운드로 가져 오기

int main() 

{ 

    FILE* fd = popen("pidof my_program","r"); 

    // ... 
    // Some code to get the pid of my_program as mpid 
    //... 

    printf("pid of my_program is %d",mpid); 
    signal(SIGTTOU, SIG_IGN); 
    setpgid(mpid,0); // Set program group id to pid of process 
    tcsetpgrp(0,mpid); // Give it terminal stdin access 
    tcsetpgrp(1,mpid); // Give it terminal stdout access 
    return 0; 
} 

. 누군가 나를 도와 줄 수 있습니까? 감사합니다. .

답변

2

쉘 명령 fg을 호출하고 pid (adviced)를 전달하여 "소프트"방식으로 수행 할 수 있습니다.

당신이 그것을 코드하려는 경우, 이것은 FG/BG는 배쉬로 코딩하는 방법입니다 (하지 않는하지 않음) :

static int 
fg_bg (list, foreground) 
    WORD_LIST *list; 
    int foreground; 
{ 
    sigset_t set, oset; 
    int job, status, old_async_pid; 
    JOB *j; 

    BLOCK_CHILD (set, oset); 
    job = get_job_spec (list); 

    if (INVALID_JOB (job)) 
    { 
     if (job != DUP_JOB) 
    sh_badjob (list ? list->word->word : _("current")); 

     goto failure; 
    } 

    j = get_job_by_jid (job); 
    /* Or if j->pgrp == shell_pgrp. */ 
    if (IS_JOBCONTROL (job) == 0) 
    { 
     builtin_error (_("job %d started without job control"), job + 1); 
     goto failure; 
    } 

    if (foreground == 0) 
    { 
     old_async_pid = last_asynchronous_pid; 
     last_asynchronous_pid = j->pgrp; /* As per Posix.2 5.4.2 */ 
    } 

    status = start_job (job, foreground); 

    if (status >= 0) 
    { 
    /* win: */ 
     UNBLOCK_CHILD (oset); 
     return (foreground ? status : EXECUTION_SUCCESS); 
    } 
    else 
    { 
     if (foreground == 0) 
    last_asynchronous_pid = old_async_pid; 

    failure: 
     UNBLOCK_CHILD (oset); 
     return (EXECUTION_FAILURE); 
    } 
} 
+0

하지만 임베디드 리눅스 머신에서이 작업을하고 있는데, 여기에는 busybox 바이너리 만 있고 fg, bg 또는 작업을 사용할 수 없습니다. 그러면 어떻게해야합니까? – Bornfree

+0

위의 코드를 컴파일하면 완료됩니다. – vulkanino

0

당신이 배경에있는 과정이있을 때 또는 일시 중지 된 경우 fg 명령을 사용하여이를 전경으로 이동할 수 있습니다. 기본적으로 가장 최근에 일시 중단되었거나 백그라운드로 이동 한 프로세스는 전경 으로 이동합니다. 포어 그라운드로 사용할 PID를 지정할 수도 있습니다.

+0

하지만 임베디드 리눅스 머신에서이 바이너리 바이너리 만 있고 fg, bg 또는 작업을 사용할 수 없습니다. 그러면 어떻게해야합니까? – Bornfree

관련 문제