一、实验二
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
命令显示当前目录下的所有文件和子目录。