父进度退出时怎么确认保障子进度退出,交叉列

2019-09-20 12:14栏目:专项工作
TAG:

原文地址:

1.进入VS2010,新建项目—>Visual C#—>Web—>ASP.NET空Web应用程序,如图所示:ag真人 1

这小节的题目看起来还挺晦涩的, crosstab 是 pandas 的一个函数, 作用还蛮强大的, 一起来看一下吧~ag真人,~~

前言

子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢?

ag真人 2

首先还是先引入一个例子文件:

父进程退出时,子进程会如何?

一般情况下,父进程退出后,是不会通知子进程的,这个时候子进程会成为孤儿进程,最终被init进程收养。我们先来看一下这种情况。

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>

intmain(void)
{
pid_tpid;
//fork一个进程
pid=fork();
//创建失败
if(pid<0)
{
perror("forkerror:");
exit;
}
//子进程
if(pid==0)
{
printf("childprocess.n");
printf("childpid:%d,parentpid:%dn",getpid(),getppid;
printf("sleep10seconds.n");
//sleep一段时间,让父进程先退出,为了便于观察,sleep10s
sleep(10);

printf("nowchildpid:%dparentpid:%dn",getpid(),getppid;
}
//父进程
else
{
printf("parentprocess.n");
sleep;
}
return0;
}

在这个程序中,我们为了让父进程先退出,子进程sleep了10秒。
运行结果如下:

parentprocess.
childprocess.
childpid:17433,parentpid:17432
sleep10seconds.
nowchildpid:17433parentpid:1658

从结果中可以看到,一开始子进程17433的父进程id是17432,但是在10秒后,它的父进程变成了1658。1685是什么进程呢?

$ls-al/proc/1658/exe
/proc/1658/exe->/sbin/upstart

由于我使用的环境是带有图形界面的ubuntu系统,所以最终并不是被我们所熟知的init进程收养,而是被一个名为/sbin/upstart的进程所收养。另外还可以观察到,该进程也是其他系统进程的父进程。

2.在解决方案处右击—>新建项目—>Windows—>类库,分别创建三层架构,Model、Dll、DAL,在每一层中创建如下图。ag真人 3

import pandas as pddf = pd.read_excel('/Users/rachel/Sites/pandas/py/pandas/13_crosstab/survey.xls')df

如何确保父进程退出的同时,子进程也退出?

既然如此,如何确保父进程退出的同时,子进程也退出呢?或许我们可以在子进程和父进程之间建立通信管道,一旦通信异常,则认为父进程退出,子进程自己也回收资源退出。但是这样做总觉得不是很正经。有没有已有的函数帮我们做这件事呢?prctl函数可以帮助我们。第一个参数中,有一个选项,叫做PR_GET_PDEATHSIG:

PR_SET_PDEATHSIG(sinceLinux2.1.57)
Settheparentdeathsignalofthecallingprocesstoarg2(eitherasignalvalueintherange1..maxsig,or0toclear).
Thisisthesignalthatthecallingprocesswillgetwhenitsparentdies.Thisvalueisclearedforthechildofafork
and(sinceLinux2.4.36/2.6.23)whenexecutingaset-user-IDorset-group-IDbinary,orabinarythathasassociatedcapa‐
bilities(seecapabilities).Thisvalueispreservedacrossexecve.

内容很多,主要意思为:设置一个信号,当父进程退出的时候,子进程将会收到该信号。

那么根据这个,我们完全可以在父进程退出时,也给子进程一个退出的信号。程序代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/prctl.h>
#include<signal.h>
intmain(void)
{
pid_tpid;
//fork一个进程
pid=fork();
//创建失败
if(pid<0)
{
perror("forkerror:");
exit;
}
//子进程
if(pid==0)
{
/*父进程退出时,会收到SIGKILL信号*/
prctl(PR_SET_PDEATHSIG,SIGKILL);
printf("childprocess.n");
printf("childpid:%d,parentpid:%dn",getpid(),getppid;
printf("sleep10seconds.n");
//sleep一段时间,让父进程先退出,为了便于观察,sleep10s
sleep(10);

printf("nowchildpid:%dparentpid:%dn",getpid(),getppid;
}
//父进程
else
{
printf("parentprocess.n");
sleep;
}
return0;
}

运行结果:

parentprocess.
childprocess.
childpid:17625,parentpid:17624
sleep10seconds.

可以看到,由于加入了

prctl(PR_SET_PDEATHSIG,SIGKILL);

在父进程退出时,子进程将会收到SIGKILL信号,而进程收到该信号的默认动作则是退出。因而最后不会看到它成为孤儿进程,被其他进程所收养。需要注意的是,该函数并非所有系统都支持。

ag真人 4

输出:
ag真人 5
好, 下面看一下 crosstab 的功力:

总结

有些情况下,我们常常需要父子进程共存亡,子进程退出时,父进程可以通过wait捕捉子进程的退出状态,但是父进程退出时,子进程却难以得知。因此,在最初fork子进程的时候,便表明了,当父进程退出的时候,子进程收到SIGKILL信号,最终也退出。以此达到同生共死的目的。当然也可以发送其他信号,由子进程捕获该信号并做后续处理。

选中Model类库--》Shift+ALT+C--》建立实体类。ag真人 6

pd.crosstab(df.Nationality, df.Handedness)

练习

尝试将上面的代码在非图形界面的linux操作系统中运行,看看最终被收养的是否为init进程。

输出:
ag真人 7
crosstab 第一个参数是列, 第二个参数是行. 还可以添加第三个参数:

交流

虽然本文方法可行,但并不适用于所有操作系统,你有什么更好的办法解决上面的问题?

微信公众号:专注但不限于分享计算机编程基础,Linux,C语言,C++,算法,数据库等编程相关[原创]技术文章,号内包含大量经典电子书和视频学习资源。欢迎一起交流学习,一起修炼计算机“内功”,知其然,更知其所以然。

pd.crosstab(df.Sex, df.Handedness, margins = True)

版权声明:本文由ag真人发布于专项工作,转载请注明出处:父进度退出时怎么确认保障子进度退出,交叉列