1

以下に、HUP を使用して execv を続行する簡単なプログラムを示します。問題は、execv 呼び出しが実行されるときです。その後、HUP が来る場所からコードが続行されます。execv の後、コードは main から終了し、main の最初からやり直す必要があります。

char* a;
char** args;

void hup_func(){
    printf("aaaa\n");
    if(execv(a,args))
        printf("bbb\n");
}

int main(int argc,char* argv[]){
    signal(SIGHUP,hup_func);
    args=argv;
    a=args[0];
    printf("%s\n",a);
    while(1){
        printf("test\n");
        sleep(10);
     }

   return 0;
}

プログラムの名前はdeneme1です。コードの出力は、HUP を送信したときのものです。

./deneme1
test
test
aaa 
bbbb
test.

しかし、HUP を送信したときに、メインの開始から開始する必要があります。そのように

./deneme1
test
test
aaa
bbb
./deneme1
test
...

前だった場所ではなく、HUP後のメインの冒頭に戻ってほしい

4

3 に答える 3

2

に正しい引数を送信していないexecvため、関数はエラーで終了しています。したがって、プロセスをプロセスの新しいコピーでオーバーレイするのではなく、シグナルハンドラーを終了するだけです。

の引数の署名execvは次のとおりです。

int execv(const char *path, char *const argv[]); 

2 番目の引数は、最後の要素がポインターであるconstへのポインターの配列である必要があります。2 番目の引数に渡す は正しい型ではありません。charNULLchar* a

最後に、非同期シグナルセーフ関数execvとは見なされませんが、姉妹関数であるためです。後者を使用する必要があります。同じことが関数のファミリーにも当てはまります...端末に書き込む必要がある場合は、代わりに使用してください。execveprintfwrite

更新:更新されたコードを再実行しました。プログラムは正常に再起動していますが、問題は、シグナル マスクが への呼び出しによってオーバーレイされた元のプロセスから継承されていることexecvです。execvシグナルハンドラー内から実行しているため、オーバーレイされたプロセスでブロックされ、プロセスに他のシグナルをSIGHUP送信できなくなります。SIGHUPこれを元に戻すには、 を使用してシグナル ハンドラを割り当てた直後に、 をSIGHUP使用してシグナルのブロックを解除する必要があります。sigprocmask()signal()

たとえば、次のように変更mainします。

int main(int argc,char* argv[])
{
    sigset_t signal_mask;

    signal(SIGHUP,hup_func);

    //unblock the SIGHUP signal if it's blocked
    sigaddset(&signal_mask, SIGHUP);
    sigprocmask(SIG_UNBLOCK, &signal_mask, NULL);

    args=argv;
    a=args[0];
    printf("%s\n",a);
    while(1){
        printf("test\n");
        sleep(10);
     }

   return 0;
}

これをコンパイルして Ubuntu 12.04 で実行したところ、完全に動作するようになりました。

于 2012-04-19T08:12:42.830 に答える
0

@Jasonが指摘したように、execvは失敗しています。このコードで自分自身をテストしてください。

#include<signal.h>
char* a;
char **args;

void hup_func(){
    printf("receivied SIGHUP\n");
    execv(a,a);
    printf("execv failed\n");
}

int main(int argc,char* argv[]){
    int b =0;
    printf("setting signal handler for SIGHUP\n");
    signal(SIGHUP,hup_func);
    args=argv;
    a=argv[0];
    printf("Before entering while %s\n",a);
    while(1){
        printf("In while %d\n",++b);
        sleep(1);
     }

   return 0;
}

次に交換

   execv(a,a);

   execv(a,args);
于 2012-04-19T08:25:43.773 に答える
0

問題は、execv 呼び出しが実行されるときです。その後、HUP が来る場所からコードが続きます。

コードにエラー チェックはありません。ほとんどの場合、execv()呼び出しは失敗します。

次のように修正してみてください。

char** gargv;

void hup_func() {
    execvp(*gargv, gargv);
    abort(); // must never get here
}

int main(int argc,char* argv[]) {
    // ...
    gargv = argv;
    // ...
于 2012-04-19T08:17:38.957 に答える