操作系统实训

int main() {
    pid_t child_pid;
    child_pid=fork();
    if(child_pid==-1) {
        perror("fork");
        return 1;
    }
    if(child_pid==0) {
        printf("This is the child process,pid=%d\n",getid());

    } else {
        printf("This is the parent process,pid=%d,child_pid=%d\n",getpid(),child_pid)
    }
    return 0;
}

 试获取信号量的锁,若获取成功则可以访问该资源,否则需要等待。而当一个线程释放该共享资源时,需要将信号量的计数器加一,以便其他线程可以进行访问。

sem_wait(&mutex);
sem_post(&mutex);
pthread_create(&threads[i],NULL,thread_function,&thread_ids[i]);

 #define BUFFER_SIZE 25
int main() {
    int fd[2];
    char write_msg[BUFFER_SIZE] = "Hello, world!";
    char read_msg[BUFFER_SIZE];
    pid_t pid;
    if (pipe(fd) == -1) {  // 创建匿名管道
        fprintf(stderr, "Pipe failed");
        return 1;
    }
    pid = fork();  // 创建子进程
    if (pid < 0) {  // 创建子进程失败
        fprintf(stderr, "Fork failed");
        return 1;
    } else if (pid == 0) {  // 子进程
        close(fd[1]);  // 关闭写端口
        read(fd[0], read_msg, BUFFER_SIZE);  // 从管道中读取数据
        printf("Child process received message: %s\n", read_msg);
    } else {  // 父进程
        close(fd[0]);  // 关闭读端口
        write(fd[1], write_msg, BUFFER_SIZE);  // 向管道中写入数据
        printf("Parent process sent message: %s\n", write_msg);
    }
    return 0;
}

producer(){
    while(1){  
        produce an item in nextp; //生产数据  
        P(empty); //(要用什么P一下) //获取空缓冲区单元  
        P(mutex);                 //互斥,进入临界区  
        add nextp to buffer;      //将数据放入缓冲区  
        V(mutex);                 //离开临界区,释放互斥信号量  
        V(full);                  //满缓冲区数加1,相当于放入缓冲区了,让缓冲区的数加1  
    }
}

consumer(){  
    while(1){  
        P(full);//获取满缓冲区单元,如果没有数据就等待  
        P(mutex);//进入缓冲区  
        remove an item from buffer;//从缓冲区取出数据  
        V(mutex);//离开临界区,释放互斥信号量  
        V(empty);//空缓冲区数加1  
        consume the item;//消费数据  
    }
}
 

进程树

 

 

一共输出 6 个。
 
首先程序一开始,bash产生一个进程 P0 执行此程序,P0 进入程序。
 
当 i=0 时:
fork() 产生一个子进程P1,同时它自己输出一个’!'。P1 继承 P0 的诸如环境变量,P1 首先会输出一个 ‘!’。
 
当 i=1 ,会继续执行 for 循环— P1 先 fork() 出一个子进程 P2,同时再输出一个 ‘!’。
P2 进程为 P1 的子进程,它会复制其父进程P2的指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个 ‘!’。
 
此时 P0 进入程序后,当 i=1 时,fork() 产生另一个它的子进程P3,同时输出一个 ‘!’。P3 同样会输出一个 ‘!’。
 

1.管道(Pipe):一种单向通信机制,只能在父子进程或兄弟进程之间使用。
2.命名管道(Named Pipe):类似于管道,但可以在不同进程之间使用。
3.消息队列(Message Queue):可以在不同进程之间传递消息,支持多对多通信。
4.共享内存(Shared Memory):可以在不同进程之间共享同一块物理内存,速度很快。
5.信号量(Semaphore):可以用来控制对共享资源的访问,避免竞争条件的发生。
6.套接字(Socket):可以在不同主机之间进行网络通信。
7.信号(Signal):可以用来通知进程某个事件已经发生。
 

1、

临界区是指并发进程中涉及共享变量的()。

A、程序段

2、

下列有关fork()函数返回值说法错误的是()

D、大于0返回值为父进程的PID号

3、

下面程序的输出是什么()

D、不确定

#include <stdio.h>

#include <unistd.h>

int main(int argc, char** argv){

   if(fork() == 0){

       printf("hello");

   }else{

       printf("world");

   }

   return 0;

}

4、

下面说法不正确的是( )

C、进程创建一般由create函数完成

5、

关于SIGCHLD信号说法错误的是()

D、由于SIGCHLD信号默认方式是忽略,所以在代码中不需要手动设置SIGCHLD信息的处理方式,也不会产生僵尸进程

6、

下列哪种通信方式只能用于具有亲缘关系进程之间的通信()

A、匿名管道

8. (简答题)
1、

比较文件的差异要用到的命令是以下哪一种?(单选)

A、diff

2、

存放设备文件的相关文件目录是?(单选)

A、/dev

3、

rm命令表示什么?(单选)

D、文件删除命令

4、

在openEuler系统中,用户文件描述符0表示?(单选)

B、标准输入设备文件描述符

5、

在使用 mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是?(单选)

C、-p

6、

执行命令“chmod o+rw myfile”后,myfile文件的权限变化为?(单选)

B、其他用户可读写myfile文件
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几秋别

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值