实验六 进程基础
项目 |
内容 |
|
这个作业属于哪个课程 |
|
|
这个作业的要求在哪里 |
|
|
学号-姓名 |
17041413--管锋正 |
|
作业学习目标 |
1、掌握Linux系统环境C语言编程概念 2、学习Linux系统进程概念 |
1、举例说明静态链接库的创建与使用


int add(int a,int b){
return a+b;}
int sub(int a,int b){
return a-b; }#include<stdio.h>
#include"common.h"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文件
int add(int a,int b){ return a+b;}//sub文件
int sub(int a,int b){ return a-b; }//main文件
#include<stdio.h>#include"common.h"int main(){ printf("3+1=%d\n",add(3,1)); printf("3-1 =%d \n",sub(3,1)); return 0;}
使用共享库,方式一:

方式二:

3、 编程实现一个简单文件复制命令。
//dircp.c文件
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>#include <stdio.h> #define BUFFERSIZE 4096 int main(int argc, char* argv[]) {if (argc != 3) { printf("usage:\n mycp src dst\n"); return 1;}int srcfd = open(argv[1], O_RDONLY); if (srcfd == -1) { perror("open");return 1; }int dstfd = open(argv[2], O_CREAT | O_WRONLY, 0666); if (dstfd == -1) { close(srcfd); perror("open"); return 1; }int len = 0;char buffer[BUFFERSIZE] = {0}; while((len = read(srcfd, buffer, BUFFERSIZE)) > 0) {if (write(dstfd, buffer, len) != len) {perror("write error"); return 1; }}if (len < 0) {perror("read error"); return 1;}close(srcfd); // 关闭文件 close(dstfd);return 0; }
4、使用fork创建一个子进程,进程创建成功后父子进程分别输出不同的内容。
///fork1.c文件
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){pid_t pid;printf("[%d]:Begin! \n",getpid());fflush(NULL);pid = fork();if(pid<0){perror("fork()");exit(1);}else if(pid > 0){printf("[%d]:Parent process if working!\n",getpid());}else{printf("[%d]:Child process if working!\n",getpid());}printf("[%d]:Finish!\n",getpid());return 0;}
删除fork1.c文件中 fflush(NULL); 这一行后运行结果为:

继续删除fork1.c文件中 “ printf("[%d]:Begin! \n",getpid()); ” 这一句中的“\n”结果为:

5、fork创建多个子进程。
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){int i;pid_t pid;printf("[%d] Begin! \n",getpid());for (i = 0;i < 3; i++){if((pid = fork()) ==0 )break;}if(pid<0){perror("fork()");exit(1);}else if(pid > 0){printf("[%d] Parent process is working!\n",getpid());}else{printf("[%d] Child process %d is working!\n",getpid(),i);}return 0;}
sleep来控制进程输出顺序:
#include <stdio.h>
#include <stdlib.h>#include <unistd.h>int main(){int i;pid_t pid;printf("[%d] Begin! \n",getpid());for (i = 0;i < 3; i++){if((pid = fork()) ==0 )break;}if(pid<0){perror("fork()");exit(1);}else if(pid > 0){ sleep(3);printf("[%d] Parent process is working!\n",getpid());}else{sleep(i);printf("[%d] Child process %d is working!\n",getpid(),i);}return 0;}
6、在 fork 之前以写的方式创建了一个文件 test.txt。然后 fork 出的子进程立即向文件中写入“world”,然后睡眠5秒。而父进程在 fork 后睡眠3秒后向 test.txt 写入 "hello",并关闭描述符。子进程恢复后,又向 test.txt 文件中写入 "lalala"后关闭描述符,结束。
//fork3.c文件
#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>int main() {int fd = open("test.txt",O_WRONLY | O_CREAT,0664);if (fd == -1){perror("open");return 1;}printf("I'm father\n");printf("before fork\n");pid_t pid = fork();if (pid > 0){sleep(3);printf("I'm father; I'm writing test.txt...\n");write(fd, "hello", 5);close(fd);}else if (pid ==0){printf("I'm child; I'm writing test.txt...\n");write(fd, "world", 5);sleep(5);write(fd, "lalala", 6);close(fd);}else {perror("fork");return 1;}return 0;}
7、分别在主函数中使用execvp启动ls命令以及使用fork函数产生子进程调用execvp启动ls。
使用execvp启动ls命令:

使用fork函数产生子进程调用execvp启动ls命令:
//exefork.c文件
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){char* argv[] = {"ls","-l",NULL};pid_t pid = fork();if (pid > 0){printf("I'm father\n");}else if (pid == 0) {printf("I'm child\n");if (execvp("ls",argv) == -1){perror ("exec");return 1;}}else {perror("fork");return 1;}return 0;}
8、创建5个僵尸进程,并在终端通过ps axf命令查看僵尸进程信息。
//fork4.c文件
#include <unistd.h>#include <stdio.h>#include <string.h>int main() {printf("before fork\n");pid_t pid, n = 5;while(n--) {pid = fork();if (pid == 0)break;else if (pid < 0){perror("fork");return 1;}}if (pid == 0) {printf("hello, I'm child %d; my father is %d\n", getpid(),getppid());//getpid() 获取当前进程的pid//getppid() 获取当前进程的父进程的pidreturn 0;}while(1) {sleep(3);printf("hello, I'm father %d\n", getpid());}return 0;}

9、通过wait来清理僵尸进程。
//fork5.c文件<br>#include <unistd.h>
#include <stdio.h>#include <string.h>#include <sys/wait.h>#include <sys/types.h>int main() {printf("before fork\n");pid_t pid, n = 5;while(n--) {pid = fork();if (pid == 0)break;else if (pid < 0) {perror("fork");return 1;}}if (pid == 0) {printf("hello, I'm child %d;my father is %d\n",getpid(),getppid());return 0;}while(1) {sleep(3);pid = wait(NULL);if (pid == -1) {perror("wait");sleep(10);printf("I'm father %d;I have wiped out all zombies\n",getpid());return 1;}printf("Hello, I'm father %d; child %d exit\n",getpid(),pid);}return 0;}
10、父进程通过waitpid函数等待特定子进程结束,若该子进程不结束,父进程一直阻塞



浙公网安备 33010602011771号