进程基础

 

项目 内容
这个作业属于哪个课程 <班级课程的主页链接 >
这个作业的要求在哪里 <作业要求链接接地址>
学号-姓名 18043213-丁宇航
作业学习目标

掌握Linux系统环境C语言编程概念;学习Linux系统进程概念

1. 请举例说明静态链接库的创建与使用。

ar:建立,修改档案或从档案中抽取成员
ar -r :替换归档文件中已有的文件或加入新文件
ar -t :显示归档文件内容

举例:

进程基础

//文件名:add.c,加法
int add(int a,int b){
return a+b;
}
//文件名:sub.c,减法
int sub(int a,int b){
return a-b;
}
//文件名:main.c
#include <stdio.h>
int add(int a,int b);
int sub(int a,int b);
int main(){
printf("3 + 1 = %d\n",add(3,1));
printf("3 - 1 = %d\n",sub(3,1));
return 0;
}

 进程基础

 进程基础

 进程基础

2. 请举例说明共享库的创建与使用。

开始的目录结构:

进程基础

//文件名:common.h
#ifndef _COMMON_
#define _COMMON_
int add(int a,int b);
int sub(int a,int b);
#endif
//文件名:add.c
int add(int a,int b){
return a+b;
}
//文件名:sub.c
int sub(int a,int b){
return a-b;
}
//文件名:main.c
#include<stdio.h>
#include"common.h"
int main(){
printf("3+1=%d\n",add(3,1));
printf("3-1=%d\n",sub(3,1));
}

进程基础

 进程基础

 进程基础

 进程基础

创建共享库:

 进程基础

使用自己的共享库:

方式一:

 进程基础

 进程基础

 进程基础

方式二:

 进程基础

 进程基础

 进程基础

3. 编程实现一个简单文件复制命令。

进程基础

 进程基础

mycp.c文件

 进程基础

 进程基础

复制的文件(test)

进程基础

 

 进程基础

4. 使用fork创建一个子进程,进程创建成功后父子进程分别输出不同的内容。

进程基础

 进程基础

 进程基础

5. 使用fork创建多个子进程。

进程基础

 进程基础

用sleep函数来控制进程输出顺序:

进程基础

 进程基础

6. 在 fork 之前以写的方式创建了一个文件 test.txt。然后 fork 出的子进程立即向文件中写入“world”,然后睡眠5秒。而父进程在 fork 后睡眠3秒后向 test.txt 写入 "hello",并关闭描述符。子进程恢复后,又向 test.txt 文件中写入 "lalala"后关闭描述符,结束。

进程基础

 进程基础

7. 分别在主函数中使用execvp启动ls命令以及使用fork函数产生子进程调用execvp启动ls

在主函数中使用execvp启动ls命令

 进程基础

 进程基础

 使用fork函数产生子进程调用execvp启动ls

进程基础

 进程基础

8. 创建5个僵尸进程,并在终端通过ps axf命令查看僵尸进程信息。

进程基础

 进程基础

9. 通过wait来清理僵尸进程。

进程基础

 

 

 进程基础

10. 父进程通过waitpid函数等待特定子进程结束,若该子进程不结束,父进程一直阻塞。

waitpid
(1)函数功能:用来等待某个特定进程的结束
(2)函数原型:
    pid_t waitpid(pid_t pid, int *status, int options);
(3)参数:
    status如果不为空,会把状态信息写到它指向的位置
    options允许改变waitpid的行为,最有用的一个选项是WNOHANG,它的作用是防止waitpid把调用者的执行挂起.
(4)返回值:成功返回等待子进程的pid,失败返回-1
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
void handler(int sig)
{
	pid_t pid;
	while ((pid = waitpid(-1,NULL,WNOHANG)) > 0)
	{
		printf("wait child sucess : %d\n",pid);
		
	}
}
int main()
{
	signal(SIGCHLD,handler);
	pid_t pid = fork();
	if (pid == 0)
	{
		printf("child1 pid : %d\n",getpid());
		sleep(3);
		exit(1);
	}
	pid_t pid2 = fork();
	if (pid2 == 0)
	{
		printf("child2 pid2 : %d\n",getpid());
		sleep(5);
		exit(2);
	}
	pid_t pid3 = fork();
	if (pid3 == 0)
	{
		printf("child3 pid3 : %d\n",getpid());
		sleep(7);
		exit(3);
	}
	printf("father pid : %d\n",getpid());
	while (1)
	{
		printf("father do self\n");
		sleep(1);
	}
	return 0;
}

进程基础

 

 进程基础

 

 进程基础

上一篇:题解5道c++面试题第一期(含解题思路、答案解析和实现代码)


下一篇:实验6进程基础