簡體   English   中英

子進程的SIGTSTP信號處理程序

[英]SIGTSTP signal handler for child process

因此,我正在嘗試在子進程中為SIGTSTP信號實現信號處理程序。

基本上我想要達到的是:

  1. 開始子進程
  2. 讓父級等待子進程
  3. 在“子進程”上調用“睡眠”達x秒。
  4. 在睡眠完成執行之前,我想發送Ctrl + Z信號。 該信號應停止子進程,但恢復父進程。 然后,父進程應該知道已停止進程的進程ID。

我使用以下命令運行它:./testsig sleep 10

到目前為止,這是我的代碼:

#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<string.h>



volatile sig_atomic_t last_proc_stopped;
volatile sig_atomic_t parent_proc_id;

 void handle_stp(int signum)
  {
    if(getpid()==parent_proc_id)
    {
        kill(parent_proc_id,SIGCONT);
        signal(SIGTSTP,handle_stp);
    }
    else
    {
        last_proc_stopped=getpid();
      kill(parent_proc_id,SIGCONT);
    }   
  }



  void main(int argc, char *argv[])
  {

    int childid=0,status;

    signal(SIGTSTP,SIG_IGN);

    parent_proc_id=getpid();


    childid=fork();

    if(childid>=0)
    {

      if(childid==0)//child
      {


        signal(SIGTSTP,handle_stp);
        strcpy(argv[0],argv[1]);
        strcpy(argv[1],argv[2]);
        argv[2]=NULL;
        printf("Passing %s %s %s\n",argv[0],argv[1],argv[2]);
        execvp(argv[0],argv);
      }

      else
      {
        wait(&status);

        printf("Last Proc Stopped:%d\n",last_proc_stopped);

      }
    }

    else
    {
      printf("fork failed\n");
    }
  }

目前,ctrl + Z似乎具有某種效果(但絕對不是我想要的效果!)

當我在執行睡眠的孩子中間按下ctrl + Z時,光標會繼續閃爍剩余的時間(在我的情況下為10秒),但是控件沒有到達父進程。

在不按Ctrl + Z的情況下,控件將按預期方式返回到父級。

我究竟做錯了什么?

我也已經看到了這個答案,但是我真的不能理解它:

使用SIGTSTP掛起子進程后,shell沒有響應

您有兩個過程:

您可以做什么來實現自己的目標?

  • 父母應該忽略這個信號,

  • 子級應保留默認的信號處理功能(這將停止處理),

  • 父級應使用waitpid()來查看子進程是否已退出或已停止,並采取相應措施(這實際上是殺死已停止的子進程)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM