我必须从我的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),pid
与dialer_pid
中gsm_transmission_thread()
的{{1}}相同函数,wvdial正确关闭其进程和pppd进程。
我哪里错了?