触摸大内存区域时执行fork exec的程序
我想编写一些具有以下要求的C代码:触摸大内存区域时执行fork exec的程序,c,linux,exec,fork,C,Linux,Exec,Fork,我想编写一些具有以下要求的C代码: 重复fork exec fork'ed进程应该使用大量内存,然后要么放弃它,要么就死掉,否则我就杀了它 有什么想法吗?intmain(intargc,char*argv[]){ int main (int argc, char *argv[]) { unsigned long long bytes; char bytes_str[32]; void *buf; int i; if (argc < 2) {
intmain(intargc,char*argv[]){
int main (int argc, char *argv[]) {
unsigned long long bytes;
char bytes_str[32];
void *buf;
int i;
if (argc < 2) {
fprintf(stderr, "usage: %s [megabytes]\n", argv[0]);
exit(EXIT_SUCCESS);
} else if (argc < 3) {
switch (fork()) {
case 0: break;
case -1: perror("fork");
exit(EXIT_FAILURE);
default: exit(EXIT_SUCCESS);
}
bytes = strtoull(argv[1], 0, 0) * 1024 * 1024;
snprintf(bytes_str, sizeof(bytes_str), "%llu", bytes);
if (execlp(argv[0], argv[0], "child", bytes_str, (char *)0) != 0) {
perror("execlp");
exit(EXIT_FAILURE);
}
/* NOT REACHED */
} else {
bytes = strtoull(argv[2], 0, 0);
}
if (bytes < 1024*1024) exit(EXIT_SUCCESS);
buf = malloc(bytes);
if (buf == 0) {
perror("malloc");
exit(EXIT_FAILURE);
}
memset(buf, '\xff', bytes);
free(buf);
bytes /= 2;
snprintf(bytes_str, sizeof(bytes_str), "%llu", bytes);
for (i = 0; i < 2; ++i) {
switch (fork()) {
case 0: break;
case -1: perror("fork");
exit(EXIT_FAILURE);
default: continue;
}
if (execlp(argv[0], argv[0], "child", bytes_str, (char *)0) != 0) {
perror("execlp");
exit(EXIT_FAILURE);
}
/* NOT REACHED */
}
return 0;
}
无符号长字节;
字符字节_str[32];
无效*buf;
int i;
如果(argc<2){
fprintf(stderr,“用法:%s[MB]\n”,argv[0]);
退出(退出成功);
}否则如果(argc<3){
开关(fork()){
案例0:断裂;
案例1:perror(“fork”);
退出(退出失败);
默认值:退出(退出成功);
}
字节=strtoull(argv[1],0,0)*1024*1024;
snprintf(bytes_str,sizeof(bytes_str),“%llu”,bytes);
if(execlp(argv[0],argv[0],“child”,bytes_str,(char*)0)!=0){
perror(“execlp”);
退出(退出失败);
}
/*未达到*/
}否则{
字节=strtoull(argv[2],0,0);
}
如果(字节<1024*1024)退出(退出成功);
buf=malloc(字节);
如果(buf==0){
佩罗尔(“马洛克”);
退出(退出失败);
}
memset(buf',\xff',字节);
免费(buf);
字节/=2;
snprintf(bytes_str,sizeof(bytes_str),“%llu”,bytes);
对于(i=0;i<2;++i){
开关(fork()){
案例0:断裂;
案例1:perror(“fork”);
退出(退出失败);
默认:继续;
}
if(execlp(argv[0],argv[0],“child”,bytes_str,(char*)0)!=0){
perror(“execlp”);
退出(退出失败);
}
/*未达到*/
}
返回0;
}
int main(int argc,char*argv[]){
无符号长字节;
字符字节_str[32];
无效*buf;
int i;
如果(argc<2){
fprintf(stderr,“用法:%s[MB]\n”,argv[0]);
退出(退出成功);
}否则如果(argc<3){
开关(fork()){
案例0:断裂;
案例1:perror(“fork”);
退出(退出失败);
默认值:退出(退出成功);
}
字节=strtoull(argv[1],0,0)*1024*1024;
snprintf(bytes_str,sizeof(bytes_str),“%llu”,bytes);
if(execlp(argv[0],argv[0],“child”,bytes_str,(char*)0)!=0){
perror(“execlp”);
退出(退出失败);
}
/*未达到*/
}否则{
字节=strtoull(argv[2],0,0);
}
如果(字节<1024*1024)退出(退出成功);
buf=malloc(字节);
如果(buf==0){
佩罗尔(“马洛克”);
退出(退出失败);
}
memset(buf',\xff',字节);
免费(buf);
字节/=2;
snprintf(bytes_str,sizeof(bytes_str),“%llu”,bytes);
对于(i=0;i<2;++i){
开关(fork()){
案例0:断裂;
案例1:perror(“fork”);
退出(退出失败);
默认:继续;
}
if(execlp(argv[0],argv[0],“child”,bytes_str,(char*)0)!=0){
perror(“execlp”);
退出(退出失败);
}
/*未达到*/
}
返回0;
}
什么??奇怪的作业?或者你还有别的目的?你试过什么?@Ivella这不是家庭作业。我还没试过。我正要去。我会发布我的代码。你需要这个做什么?如果我们知道实际的问题,我们可能能够提供更好的解决方案…@thkala我正在测试一个较旧的linux内核2.6.31,以测试fork exec机制是否足够稳定。问题是我们不能切换到更新的内核,只能使用这个版本。我们最近看到一些奇怪的事情发生,人们怀疑可能需要一些fork exec补丁来解决一些问题。呃,我不想听起来有点屈尊俯就,但是,你看到的任何奇怪的事情都不太可能是由于Linux内核中fork/exec机制的错误造成的——这是运行最频繁的子系统之一……什么??奇怪的作业?或者你还有别的目的?你试过什么?@Ivella这不是家庭作业。我还没试过。我正要去。我会发布我的代码。你需要这个做什么?如果我们知道实际的问题,我们可能能够提供更好的解决方案…@thkala我正在测试一个较旧的linux内核2.6.31,以测试fork exec机制是否足够稳定。问题是我们不能切换到更新的内核,只能使用这个版本。我们最近看到一些奇怪的事情发生,人们怀疑可能需要一些fork exec补丁来解决一些问题。呃,我不想听起来有点屈尊俯就,但是,您看到的任何奇怪的事情都不可能是由于Linux内核中fork/exec机制的错误造成的——这是运行最频繁的子系统之一。。。