头歌实验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! "; char *str2="hello welcome! "; 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--- "); } //子进程执行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; }