头歌实验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;
}

猜你喜欢

转载自blog.csdn.net/qq_62791684/article/details/127621426