zoukankan      html  css  js  c++  java
  • 003_process_base

    1. Functions associated with creating a process
        system : execute a shell command and it's a blocking function
                system("ls -l");
            Create an independent process,and it has independent code space and memory space.
            The "system" function will return after the process is finished.
        popen : pipe stream to or from a process
            Create a child process and also create a pipe between the parent process and the child process.
        exec : This is a family of functions
            execl/execlp : replace the code data of the current code space and the function itself do not create a new process
        fork : Create a child process and clone the code space of the parent process and it's location that the parent process is executed to.
            The "fork" is not called in the child process, so it return 0.
            The child process and the parent process are run at the same time.

    //system

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    int main()
    {
        printf("Process:%d ",getpid());
        sleep(3);
        return 99;
    } // test

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/wait.h>
    main()
    {
        printf("system:%d ",getpid());
        int r = system("./test");
        // You can not get the return value directly
        printf("return value: %d ",r>>8&255);
        printf("return value: %d ",WEXITSTATUS(r));
    }

    //popen

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/wait.h>

    main()
    {
        char buf[1025];
        //FILE *f = popen("ls -l","r");
        FILE *f = popen("./test","r");
        int fd = fileno(f);

        int r;
        printf("begin===============================");
        while((r = read(fd,buf,1024))>0)
        {
            buf[r] = 0;
            printf("%s",buf);
        }
        printf("end=============================== ");
        close(fd);
        pclose(f);
    }

    //exec

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

    int main()
    {
        printf("main:%d ",getpid());
        //int r = execl("test","param1",NULL);
            //The following code is replaced by the program "test",so the following code will not be executed
            //We do not create a new process,we just replace the code space,so there is only one process all the time and printf the same ID.
        //int r = execl("/bin/ls","ls","-l",NULL); //we must use "/bin/ls"
        int r = execlp("ls","ls","-l",NULL); //we can use "ls", which is different from execl which use "/bin/ls"
            //execl : Only search in the current path
            //execlp : Search in the current path and PATH
        printf("end:%d",r);
    }

    //fork

    #include<stdio.h>
    #include<unistd.h>
    int main()
    {
        printf("Before creating a process! ");
        int pid = fork();
            // We create a new process and clone the code space of the parent process
        if(pid == 0) //child process
        {
            while(1)
            {
                printf("this is child process:%d ",getpid());
                sleep(1);
            }
        }
        else // parent process
        {
            while(1)
            {
                printf("this is parent process:%d ",getpid());
                sleep(1);
            }
        }
        printf("After creating a process: ");
        return 0;
    }

  • 相关阅读:
    Android Studio 开发利器【经常使用插件】
    Eclipse改动Project的文件夹位置
    《信息检索》第8讲 毕业论文学习指导(资源及预习材料)
    Android:使用SparseArray取代HashMap优化性能
    JavaScript初探之——图片移动
    C#趣味程序---九九乘法表
    CoreData使用方法三: NSPredicate在CoreData中的使用
    Eclipse中使用正则屏蔽Logcat中的某些Tag
    给一个int型整数,如何将这个整数的奇偶位互换
    30款基本UX工具
  • 原文地址:https://www.cnblogs.com/liujun5319/p/9638455.html
Copyright © 2011-2022 走看看