私は本当に巨大なアーカイブを持っています。これはファイルごとに抽出し、さらに処理する必要があります。アーカイブ全体(RAMでもフラッシュでもない)を抽出するのに十分なメモリがないため、抽出された各ファイルの後に(raise(SIGSTOP)
)停止する小さなアプリケーションを書きました。同等のは、このコードのようになります。スクリプト化されたときにSIGSTOPが機能しない
#include <stdio.h>
#include <signal.h>
int main() {
printf("started.\n"); fflush(stdout);
sleep(2); // extracting archive
printf("stopping\n"); fflush(stdout);
raise(SIGSTOP); // stopping
printf("resume + done\n"); fflush(stdout);
return 0;
}
私はターミナルでこれを実行しながら、これは正常に動作します:
$ gcc -o dosleep main.c
$ ./dosleep
started.
stopping
[1]+ Stopped ./dosleep
$ fg
./dosleep
resume + done
$
しかし、スクリプトからメソッドを呼び出すとき、コマンドは決して返しません:
$ cat doit.sh
#!/bin/sh
echo "STARTING"
./dosleep
echo "BACK"
$ ./doit.sh
STARTING
started.
stopping
^C^C^C^C^C^C
端末とスクリプトの動作が異なるのはなぜですか?この動作を変更する方法はありますか?
おかげで、カール・
thanks - busyboxシェルでも動作します。 – Charly
ログインシェルからスクリプトを呼び出すときに 'setsid sh -c 'myscript.sh dev/tty1''で起動する必要があります。そうでなければ、' ttyにアクセスできません。ジョブ制御がオフになっています。 – Charly
@Charly、...「TTYなしの場所から」というように「ログインシェルからではありません。 2つは幾分直交しています - TTYを持たないログインシェル、またはログインシェルのないTTYを持つことは可能です。 –