2019苏嵌寒假集训02

2019.01.13

今天主要学习了父进程,子进程,孤儿进程,僵尸进程,杀死进程等进程的相关操作

1.main函数后面括号里有两个参数int argc, char *argv[] 在linux中表示的是./运行后接的参数

int main(int argc, char *argv[])

2.fork() 可以产生父子进程,父子进程同时进行但先后顺序不一定 父进程返回子进程的id

int main()
{
    pid_t pid;

    pid = fork();
    if (-1 == pid)   //出错
    {
        perror("fork");
        exit(1);
    }
    else if (0 == pid)  
    {
        printf("This is Child! %d\n", getpid());
        printf("ppid %d\n", getppid());
        printf("pid = %d\n", pid);
        printf("***********\n");

        while (1)
        {
            printf("child!\n");
            sleep(1);
        }
    }
    else              
    {
        printf("This is Parent! %d\n", getpid());
        printf("pid = %d\n", pid);
        while (1)
        {
            printf("parent!\n");
            sleep(2);
        }
    }
    return 0;
}

3.vfork()也可以产生父子进程 但与fork()不同 vfork()的父子进程共享地址空间 而且子进程一定先运行

int main()
{
    pid_t pid;
    int a = 1;

    pid = vfork();   //子进程和父进程共享地址空间
    if (-1 == pid)
    {
        perror("vfork");
    }
    else if (0 == pid)   //一定是子进程先运行
    {
        a++;
        printf("This is Child a = %d    %d!\n", a, getpid());
        sleep(2);
        exit(1);   //子进程指定退出状态
    }
    else
    {
        a++;
        printf("This is Parent a = %d    %d!\n", a, getpid());
    }

    return 0;
}

3.exec用被执行的程序替换调用它的程序。
    区别: fork创建一个新的进程,产生一个新的PID。
                exec启动一个新程序,替换原有的进程,因此进程的PID不会改变

int main()
{
    pid_t pid;

    pid = vfork();
    if (-1 == pid)
    {
        perror("vfork");
    }
    else if (0 == pid)
    {
        char *arg[] = {"./test", "hello", "1234", "world", NULL};
        printf("This is Child pid = %d\n", getpid());
        //execl("/home/167/linux/process/test", "./test", "hello", "1234", "world", NULL); //启动新进程
        //execl("/bin/ls", "ls", "-l", "-a", NULL);
        execv("/home/167/linux/process/test", arg);
        printf("helloworld!\n");
    }
    else
    {
        printf("This is Parent!\n");
    }
    return 0;
}

4.采用父子进程对文件进行操作可以有两种方式 1.一个是子进程打开文件写文件 父进程打开文件读文件2.另一个是先开文件然后子进程写文件父进程读文件

一。第一种

void WriteFile()
{
    int fd = open("hello.txt", O_WRONLY | O_CREAT, 00700);
    if (-1 == fd)
    {
        perror("open");
    }

    char buf[32] = "helloworld";

    int ret = write(fd, buf, strlen(buf));
    if (-1 == ret)
    {
        perror("write");
    }

    close(fd);
}

void ReadFile()
{    
    int fd = open("hello.txt", O_RDONLY);
    if (-1 == fd)
    {
        perror("open");
    }
    char buf[32] = {0};

    int ret = read(fd, buf, sizeof(buf));
    if (-1 == ret)
    {
        perror("read");
    }
    printf("read from file %s\n", buf);
    close(fd);
}

int main()
{
    pid_t pid;

    pid = fork();
    if (-1 == pid)
    {
        perror("fork");
        exit(1);
    }
    else if (0 == pid)  //子进程写文件
    {
        WriteFile();
    }
    else     //父进程读文件
    {
        sleep(1);
        ReadFile();
    }


    return 0;
}


二。第二种

void WriteFile(int fd)
{
    char buf[32] = "helloworld";

    int ret = write(fd, buf, strlen(buf));
    if (-1 == ret)
    {
        perror("write");
    }
}

void ReadFile(int fd)
{    
    char buf[32] = {0};

    lseek(fd, 0, SEEK_SET);
    int ret = read(fd, buf, sizeof(buf));
    if (-1 == ret)
    {
        perror("read");
    }
    printf("read from file %s\n", buf);

    close(fd);
}

int main()
{
    pid_t pid;

    int fd = open("hello.txt", O_CREAT | O_RDWR, 00700);
    if (-1 == fd)
    {
        perror("open");
        exit(1);
    }

    pid = fork();
    if (-1 == pid)
    {
        perror("fork");
        exit(1);
    }
    else if (0 == pid)  //子进程写文件
    {
        WriteFile(fd);
    }
    else     //父进程读文件
    {
        sleep(1);
        ReadFile(fd);
    }

    return 0;
}

5.孤儿进程指父进程提前结束 僵尸进程指父进程没有回收子进程资源

wait(&status);    //1、等待子进程结束  2、回收子进程资源

    waitpid(pid, &status, 0);          //等待指定的进程结束

你可能感兴趣的:(2019苏嵌寒假集训02)