操作系统Ubuntu(实验三四)

  • 时间:
  • 来源:互联网
  • 文章标签:

实验三四

  • 3._实验三:Linux进程/线程的异步并发执行
    • 3.1_fork()函数创建子进程
    • 3.2_创建线程
      • pthread_create();
  • 4._实验四:使用信号量进行互斥与同步
    • 4.1_信号量初使用
      • (1)信号量简单介绍
      • (2)信号量以及P、V操作的使用方法
      • (2)利用信号量实现同步互斥

3._实验三:Linux进程/线程的异步并发执行

3.1_fork()函数创建子进程

fork()函数用法解释
个人观点

#include <unistd.h>  
#include <stdio.h>   
int main ()   
{   
    pid_t fpid; //fpid表示fork函数返回的值  
    int count=0;  
    fpid=fork();   
    if (fpid < 0)   
        printf("error in fork!");   
    else if (fpid == 0) {  
        printf("i am the child process, my process id is %d/n",getpid());   
        printf("我是爹的儿子/n");//对某些人来说中文看着更直白。  
        count++;  
    }  
    else {  
        printf("i am the parent process, my process id is %d/n",getpid());   
        printf("我是孩子他爹/n");  
        count++;  
    }  
    printf("统计结果是: %d/n",count);  
    return 0;  
}  

当执行到代码段fpid=fork(); 时,此时新建了一个子进程,其直观图如下:
在这里插入图片描述
练习:
画出流程图

#include <unistd.h>
#include <stdio.h>
int main(){
        pid_t son_pid,daughter_pid;
        int count = 1;
        son_pid = fork();
        if(son_pid == 0){
                count++;
                printf("i am son,count = %d\n",count);
        }else{
                daughter_pid = fork();
                if(daughter_pid == 0){
                        count++;
                        printf("i am daughter, count = %d\n",count);
                }else{
                        count++;
                        printf("i am father,ID = %d, count = %d\n",daughter_pid,count);
                        waitpid(son_pid,NULL,0);
                        waitpid(daughter_pid,NULL,0);
                }
        }
}

在这里插入图片描述

3.2_创建线程

pthread.h的使用

pthread_create();

在这里插入图片描述
创建两个线程即函数son()和函数daughter();两者执行顺序随机且同步

4._实验四:使用信号量进行互斥与同步

4.1_信号量初使用

(1)信号量简单介绍

Linux提供两种信号量:
内核信号量:用于内核中资源共享控制
用户态信号量:主要包括POSIX信号量和SYSTEM V信号量。其中POSIX信号量分为两类。
无名信号量:主要用于线程间同步,也可用于进程间(由fork产生)同步。
有名信号量:既可用于进程间同步,也可用于线程间同步。

(2)信号量以及P、V操作的使用方法

POSIX有名信号量主要包括:

sem_t* sem_open(const char *name, int oflag, mode_t mode, int value);
//例如:创建一个互斥信号量mutex,初值为1即mutex = 1,访问权限为0666(我也不知道啥意思),
//如信号量存在,则打开之,如不存在,则创建  
sem_t* mutex("mutex",O_CREATE,0666,1);

①name: 文件名路径,如’mysem’,会创建/dev/shm/sem.mysem
②oflagO_CREATEO_CREATE | O_EXCL
O_CREATE:如信号量存在,则打开之,如不存在,则创建
O_CREATE | O_EXCL:如信号量已存在,则返回error
③mode:信号量访问权限,如0666
④value:信号量初始化值

int sem_wait(sem_t *sem)

测试指定的信号量的值,相当于P操作
sem > 0,则减1立刻返回;
sem = 0,则睡眠直到sem > 0,此时立刻减1,然后返回

int sem_post(sem_t *sem)

释放资源,相当于V操作,信号量sem的值加1,唤醒正在等待该信号量的进程/线程

int sem_close(sem_t *sem)

关闭有名信号量
进程中,如果使用完信号量,应使用该函数关闭有名信号量

int sem_unlink(const char *name)

删除系统中的信号量

(2)利用信号量实现同步互斥

本文链接http://www.taodudu.cc/news/show-1781914.html