2012-03-07 72 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

你可以通過調用shell命令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

但我在嵌入式Linux機器上運行,我只有busybox二進制文件,我沒有fg,bg或可用的作業。我該怎麼做呢? – Bornfree 2012-03-12 07:04:29

+0

我可以編譯上面的代碼,就完成了。 – vulkanino 2012-03-13 08:24:31

0

當你有一個過程,是在後臺或暫停,您可以使用 命令fg命令將其移動到前臺。默認情況下,最近暫停或移動到後臺的進程移動到前臺的 。你也可以指定它使用哪個pid來使它成爲前景。

+0

但我在嵌入式Linux機器上運行,我只有busybox二進制文件,我沒有fg,bg或可用的作業。我該怎麼做呢? – Bornfree 2012-03-12 07:05:29