操作系统课设-Linux 进程控制

该文介绍了两个Linux下的C程序示例,一个是使用fork()创建进程并展示并发执行,另一个是子进程通过execlp()执行新任务。文中详细解析了程序流程和关键函数的作用,如srand(),sleep(),fork(),execlp()和wait(),并解释了如何通过这些函数实现进程的创建和任务执行。
摘要由CSDN通过智能技术生成

一、实验二

Linux 进程控制

二、实验内容

首先要安装Linux系统,由于之前已经安装过了,这里省略这个过程。

1. 清单2-1

 运行指导书中的代码:

/*  实验二源程序 */
//清单2-1  创建进程
#include <stdio.h>
#include <stdlib.h>
main()
{
  int x;
  srand((unsigned)time(NULL));
  while((x=fork())==-1);
  if (x==0)
  {	
	sleep(rand() % 2);
	printf("a");
  }
  else
  {
	sleep(rand() % 3);
	printf("b");
  }
  printf("c");
}

结果显示:

多次测试发现会生成"ac","bc"两种字符串,顺序随机。

这是一个在Unix/Linux操作系统下使用fork()函数创建进程的C程序。以下是主要函数和变量的解释:

变量

  • x:保存 fork() 函数返回值,如果为 0 表示当前正在运行的进程是子进程,否则表示当前正在运行的进程是父进程。

函数

  • srand():初始化随机数生成器的种子。
  • time():获取当前时间戳。
  • fork():创建一个新进程,如果成功则返回 0 给子进程,返回子进程的进程 ID 给父进程,如果失败则返回 -1。
  • sleep():该函数会使当前进程暂停指定的秒数,让 CPU 让给其他进程。当时间到期后,进程会恢复运行状态。在该程序中,sleep()函数被用于子进程和父进程中,以模拟并发执行的环境。它使用了rand() % n表达式,其中n是等待的最大时间(秒)。例如,rand() % 2表示在 0-1 秒之间随机休眠一段时间。这样做可以确保父进程和子进程在不同的时间点打印字符,增强并行执行的效果。

主要流程

该程序使用了 while 循环和 fork() 函数来创建进程。在循环中,调用 fork() 函数创建一个新进程,如果返回值为 -1,则说明创建进程失败,继续循环;如果返回值为 0,则说明当前进程是子进程,随机休眠一段时间后打印字符 "a";如果返回值不为 0,则说明当前进程是父进程,随机休眠一段时间后打印字符 "b"。最后,无论是父进程还是子进程,都会打印字符 "c"。

该程序用来演示进程的创建和并发执行。由于父进程和子进程有各自独立的代码路径,它们可能会以不同的顺序打印字符 "a"、"b" 和 "c",这展示了进程之间的并发执行。程序中使用了随机数生成器和休眠函数来模拟实际的并发执行环境。

2. 清单2-2

运行指导书中的代码:

//清单2-2 子进程执行新任务
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
  pid_t pid;
  /* fork a child process */
  pid = fork();
  if (pid < 0) 
  { /* error occurred */
    fprintf(stderr, "Fork Failed");
    return 1;
  }
  else if (pid == 0) 
  { /* 子进程 */
    execlp("/bin/ls","ls",NULL);
  }
  else { /* 父进程 */
  /* 父进程将一直等待,直到子进程运行完毕*/
    wait(NULL);
    printf("Child Complete");
  }
  return 0;
}

结果显示:

这是一个在 Unix/Linux 操作系统下使用 fork() 函数创建子进程,并在子进程中调用 execlp() 函数执行新任务的 C 程序。以下是主要函数和变量的解释:

变量

  • pid:保存 fork() 函数返回值,如果为 0 表示当前正在运行的进程是子进程,否则表示当前正在运行的进程是父进程。

函数

  • fork():创建一个新进程,如果成功则返回 0 给子进程,返回子进程的进程 ID 给父进程,如果失败则返回 -1。
  • execlp():在当前进程中执行指定的程序文件,取代当前进程的映像。第一个参数是可执行文件的路径,第二个参数是可执行文件名,后面的参数都是命令行参数,以 NULL 结尾。
  • wait(NULL):等待子进程的终止,如果子进程先于父进程结束,则父进程会一直等待,直到子进程结束。如果子进程已经结束,则该函数立即返回。

主要流程

该程序使用了 fork() 函数创建一个新进程,然后根据返回值判断是当前进程是子进程还是父进程。如果返回值为 0,则说明当前进程是子进程,它调用execlp()函数执行一个新的程序;如果返回值不为 0,则说明当前进程是父进程,它通过调用 wait(NULL) 函数等待子进程结束,然后打印 "Child Complete" 的消息。

在该程序中,execlp()函数是用来执行新任务的。它会取代当前进程的映像,运行指定的可执行文件,并传递给它参数。在本例中,我们使用 /bin/ls 命令显示当前目录下的所有文件和子目录。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值