2012-03-07 15 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は、bashのにコード化された方法です。

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マシン上で実行しており、fg、bg、またはジョブを利用することはできません。どうすればいいですか? – Bornfree

+0

私はあなたが上記のコードをコンパイルすることができます。 – vulkanino

0

あなたがバックグラウンドで動作しているプロセスがある場合またはサスペンドされている場合は、 fgコマンドでフォアグラウンドに移動できます。デフォルトでは、最も最近停止された、またはバックグラウンドに移動されたプロセスは、フォアグラウンドの に移動します。フォアグラウンドにするpidを指定することもできます。

+0

しかし、これは私がビジーボックスバイナリしか持っていない組み込みLinuxマシンで実行しています。私はfg、bg、またはジョブを利用できません。どうすればいいですか? – Bornfree

関連する問題