プロセスから制御端末に信号を送る

プロセスから制御端末に信号を送る

次のタスクを実行するきれいでエレガントな方法を知りたいです。fooというシェルスクリプトの一部として内部的に実行されるC ++プログラムを書いているとしましょうbar.sh。シェルスクリプトをfooバックグラウンドプロセスとして実行し、待機したい。~まで実行がfoo選択した行に達したら、bar実行を続行する必要があります。

明確にするために、以下はダミーの例ですbar.sh

#!/bin/bash
./foo
wait 
echo "WAKING UP"

これはfoo

#include <iostream>
 int main(){
    for (int i = 0; i < 1000000; i++){
          std::cout << i << std::endl;

          if (i == 50){
              //Wake up bash!
          }
    }
 }

waitコマンドが繰り返し50で停止するようにfoo修正したいと思います。したがって、forループがに達すると目を覚ましてWAKING UPを印刷する必要があります。もちろん、走り続けることもできます。barbarfoofooi = 50barfoo

この効果を得るには、これらのプログラムをどのように修正する必要がありますか?

ベストアンサー1

fork()これが基本的に+の意味ですsetsid()

bar.sh

#!/bin/bash

echo "Launching foo"
./foo
echo "Waking up"

foo.c

#include <stdio.h>
#include <unistd.h>


int main(int ac, char ** av)
{
    int pid;
    for (int i=0; i<5; i++) {
        sleep(1);
    }
    printf("OK, we count to 5.\n");

    /* 
     * Here we fork() + setsid() to detach from parent process
     * Return value of fork is 0 if you are in child, pid of the child 
     * if you're in the parent process 
     */
    pid = fork();
    if (pid == 0) {
        setsid();
        printf("We forked, still running but shell may be back\n");
        sleep(5);
        printf("Exiting ...\n");
    } else {
        return 0;
    }
}

結果

/tmp/pouet$ ps aux|grep foo
me  8595  0.5  0.1 217548 18576 pts/12   T    14:17   0:01 vim foo.c 
me  9167  0.0  0.0  12716   912 pts/12   S+   14:21   0:00 grep foo
/tmp/pouet$ ./bar.sh 
Launching foo
OK, we count to 5.
We forked, still running but shell may be back
Waking up
/tmp/pouet$ ps aux|grep foo
me  8595  0.5  0.1 217548 18576 pts/12   T    14:17   0:01 vim foo.c 
me  9189  0.0  0.0   4160    76 ?        Ss   14:21   0:00 ./foo 
me  9192  0.0  0.0  12716   940 pts/12   S+   14:21   0:00 grep foo
/tmp/pouet$ Exiting ...

/tmp/pouet$ ps aux|grep foo
me  8595  0.5  0.1 217548 18576 pts/12   T    14:17   0:01 vim foo.c
me  9212  0.0  0.0  12716   908 pts/12   S+   14:21   0:00 grep foo

おすすめ記事