Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
触摸大内存区域时执行fork exec的程序_C_Linux_Exec_Fork - Fatal编程技术网

触摸大内存区域时执行fork exec的程序

触摸大内存区域时执行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) {

我想编写一些具有以下要求的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) {
            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机制的错误造成的——这是运行最频繁的子系统之一。。。