头歌实验4:Linux系统的进程控制(编程实验)
第一关
任务:
通过提示,在右侧编辑器中补充代码,完成在指定文件中添加内容,具体要求如下:
创建进程;
父进程向文件中添加hello world!;
子进程向文件中添加hello welcome!;
只需修改文件内容即可,平台将为你输出文件内容。
提示:fork()函数的返回值为0时则为子进程。
一些说明:
在使用创建进程函数前,我们需要先导入unistd.h
库。
进程创建函数原型:pid_t fork(NULL)
例如
pid_t pid = fork(); //pit_t 是引入unistd.h 库后有的
//pid_t 是整形 类同于 int
如上,我们就创建了一个进程
这里的pid在子进程中返回值为0
所以答案如下:
#include <stdio.h>
#include<unistd.h>
#include <string.h>
//请在此处添加导入相应库函数代码
int main(){
FILE *fp=fopen("test.txt","w+");
//这里是打开文件的操作
int pid; //pid表示fork函数的返回值
/********** Begin **********/
char *str1="hello world!\n";
char *str2="hello welcome!\n";
pid=fork();
if(pid==0)
{
fputs(str2,fp); //这个是向文件中写入字符串
}
else
fputs(str1,fp);
/********** End **********/
fclose(fp);
return 0;
}
第二关:
任务:
在右侧编辑器补充代码,要求如下:
创建进程;
在父进程中输出entering main process—;
在子进程中使用execl()函数调用src/step2/hello.c文件,测试环境中已将path置为src/step2,因此带路径的文件名为./hello
一些说明:
进程的加载:
execl()函数:
int execl(const char *path, const char *arg, ...)
函数参数说明:
path
:要执行的程序路径。可以是绝对路径或者是相对路径。在execv、execve、execl和execle这4个函数中,使用带路径名的文件名作为参数。
arg
:程序的第0个参数,即程序名自身。相当于argv[O]。
…
:命令行参数列表。调用相应程序时有多少命令行参数,就需要有多少个输入参数项。最后应该以NULL结尾,表明命令行参数结束。
返回值:-1表明调用exec失败,无返回表明调用成功。
所以答案如下:
#include <stdio.h>
#include<string.h>
#include<unistd.h>
//请在此处添加导入相应库函数代码
int main(){
/********** Begin **********/
//父进程输出
int pid;
pid=fork();
if(pid==0)
{
execl("./hello",NULL);
}
else
{
printf("entering main process---\n");
}
//子进程执行hello.c文件
/********** End **********/
return 0;
}
第三关
任务:
根据提示,在右侧编辑器补充代码,创建两个子进程,第一个进程打印I am first process!,第二个进程打印I am second process!,父进程打印I am father process!。
要求实现先打印第一个进程内容,再打印第二个进程内容,最后打印父进程内容。
提示:进程加载execl函数调用输出用法execl(“/bin/echo”,“echo”, “输出语句”, NULL);
上答案:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
//请在此处添加导入相应库函数代码
int main()
{
int p1, p2; //进程ID
/********** Begin **********/
p1=fork();
if(p1==0)
execl("/bin/echo","echo", "I am first process!", NULL);
else
wait(NULL);
p2=fork();
if(p2==0)
execl("/bin/echo","echo", "I am second process!", NULL);
else
wait(NULL);
printf("I am father process!");
//execl("/bin/echo","echo",NULL);
/********** End **********/
return 0;
}
更多推荐
所有评论(0)