计算机操作系统---进程同步

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011583316/article/details/83474220

实验目的

进一步认识并发执行的实质。掌握操作系统的进程同步原理
2、分析进程竞争资源的现象,学习解决进程互斥的方法
3、分析进程合作现象,学习解决进程同步的方法

实验内容]

  • 编写一段程序,当此程序运行时,完成父进程创建一个子进程,要求子进程首先在屏幕上显示本进程的序列号,然后父进程再显示孩子进程的序列号和自己的进程序列号。试观察记录屏幕上的显示结果.
  • 修改实验二中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥,观察并分析出现的现象

实验步骤

一、所涉及的系统调用

  1. pid=fork( )
  2. getpid()该系统调用的返回值为调用它的那个进程的进程内部标识符,即进程序列号。

3.wait()和exit()
无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。
wait函数用于使父进程阻塞,直到一个子进程结束。当某进程执行到wait()时,会暂时停止目前进程的执行,直到有信号来到或同步等待其子进程终止。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。
父进程调用wait(),该父进程可能有以下几种情况:
1)如果其所有子进程都还在运行,则父进程阻塞等待。
2)如果一个子进程已终止,其终止状态字SIGCHLD放在指定位置等待父进程提取,此时父进程可立即得到终止状态字并返回。
3)如果它没有任何子进程,父进程出错立即返回。
wait()和exit()的相关头文件为:

#include < stdio.h>
#include < stdlib.h>

  1. lockf(files,function,size)
    用作锁定文件的某些段或者整个文件。
    本函数的头文件为
    #include “unistd.h”
  • 参数定义:
    int lockf(files,function,size)
    int files,function;
    long size;
    其中:
  • files是文件描述符;
  • function是锁定和解锁:1表示锁定,0表示解锁。
  • size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。

C语言代码—(一)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int p1,p2,i;
pid_t pid;
 int status;
while((p1=fork( ))== -1);       /*创建子进程p1*/
if (p1==0)
{
printf("*********************\n");
printf("  子进程打印\n");
printf("当前子进程ID:%d\n",getpid());

exit(0);
}

else
{

 pid = wait(&status);
printf("*********************\n");
printf("  父进程打印\n");
printf("当前子进程ID:%d\n",pid);
printf("当前父进程ID:%d\n",getpid());
printf("退出状态号:%d\n",WEXITSTATUS(status));
printf("**************\n");
}
return 0;
}

C语言代码—(二)

#include <stdio.h>
#include <unistd.h>
int main()
{
int p1,p2,i;

while((p1=fork( ))== -1);       /*创建子进程p1*/
if (p1==0)
{
lockf(1,1,0);          /*加锁,这里第一个参数为stdout(标准输出设备的描述符)  1锁定 0解锁*/ 
printf("当前进程ID:%d\n",getpid());
for(i=0;i<10;i++)
   printf("daughter %d\n",i);
    lockf(1,0,0);                     /*解锁*/
}
else
{
 while((p2=fork( ))==-1);  /*创建子进程p2*/
if (p2==0)
{
lockf(1,1,0);             /*加锁*/
printf("当前进程ID:%d\n",getpid());
for(i=0;i<10;i++)
printf("son %d\n",i);
lockf(1,0,0);                 /*解锁*/
}
else
{
lockf(1,1,0);                   /*加锁*/
printf("当前进程ID:%d\n",getpid());
for(i=0;i<10;i++)
printf(" parent %d\n",i);
lockf(1,0,0);              /*解锁*/
}
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/u011583316/article/details/83474220