当我在C代码中调用kill()函数时,Wvdial没有正确关闭

时间:2015-10-22 00:11:42

标签: c ipc kill

我必须从我的C代码关闭一个wvdial连接,但它没有正确关闭:当wvdial关闭时,pppd进程保持活动状态,因此连接。 我用fork创建了一个并行进程,打开了wvdial连接。代码如下(gsm_transmission_thread简化为要点):

int launch_gsm_dialer(void)
{
  pid_t child_pid;
  char *arg_list[] = {"sudo", "wvdial", "Defaults", NULL};

  child_pid = fork();
  if(child_pid != 0)
    {
      return child_pid;
    }
  else
    {
      execvp("sudo", arg_list);
      fprintf(stderr, "ERROR: execvp() fault in %s\n", __func__);
      return;
    }
}

void* gsm_transmission_thread(void *arg)
{
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

  pid_t dialer_pid;

  dialer_pid = launch_gsm_dialer();

  [open protocols connection code]

  while(gsm_transmission == GSM_OPEN)
    {
      [data transmit code]
    }

  kill(dialer_pid, SIGINT);  //Here I want to close wvdial
  transmission_thread_fl = THREAD_STOP;
}

此代码关闭了wvdial进程,但没有关闭pppd进程。如果我执行ctrl ^ c它会正确关闭wvdial和pppd,但我的程序以错误的模式终止。 即使我在另一个终端中启动kill -2 pid命令(我在Raspberry上使用Raspbian),piddialer_pidgsm_transmission_thread()的{​​{1}}相同函数,wvdial正确关闭其进程和pppd进程。 我哪里错了?

0 个答案:

没有答案