Linux Ubuntu操作系统下的进程的创建

又是自闭的一天 ,花一个下午写的作业如果不整理过几天又忘了.
这玩意书上没有,又要自学. 之所以会有一个关于进程通信的作业,是作为下一次作业的前缀知识.
但是下一个作业还是写崩了… QAQ …
先给出题目和答案,相信这才是首要目标.

一.
编写一个C 程序,并使用系统调用fork()创建一个子进程。
要求如下:
①在子进程中分别输出当前进程为子进程的提示、当前进程的PID 和父进程的PID、根据用户输入确定当前进程的返回值、退出提示等信息。
②在父进程中分别输出当前进程为父进程的提示、当前进程的PID 和子进程的PID、等待子进程退出后获得的返回值、退出提示等信息。
提示:
首先在主程序中通过fork()创建子进程,并根据fork()的返回值确定所处的进程是子进程还是父进程,然后分别在子进程和当前进程(父进程)中调用getpid()、getppid()、wait()等函数以完成实验内容
提交源代码,并上传实验结果截图。

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
int main(void){
	int result, status;
	pid_t pid = fork();
	if(pid < 0){
		fprintf(stderr, "Fork Failed.\n");
		return 1;
	}else if(pid == 0){
		printf("Child Start~\n"); //进入子进程的提示
		printf("CHILD:当前进程的标识符:%d\n",getpid()); //当前进程的pid(子进程
		printf("CHILD:当前进程的父进程标识符:%d\n",getppid()); //当前进程父进程的pid
		printf("请输入子进程返回值~\n");
		scanf("%d",&result); //用户输入返回值
		printf("Child Complete~\n"); //标识子进程执行完毕
		exit(result); //将用户输入的返回值返回给父进程
	}else{
		printf("Father start~\n"); //进入父进程的提示
		printf("FATHER:当前进程的标识符:%d\n",getpid()); //当前进程的pid(父进程
		printf("FATHER:当前进程的子进程标识符:%d\n",pid); //当前进程子进程的pid
		wait(&status); //等待子进程结束,并且获取子进程的返回值,存入status
	  	if (WIFEXITED(status))	printf("%d\n", WEXITSTATUS(status));
	  	//如果存在返回值, 那么输出.
		printf("Father Complete~\n");
	}
	return 0;
}

二.
编写一个C 程序,使用系统调用fork()以创建一个子进程,并使用这个子进程调用exec 函数族以执行系统命令ls。
提示:Linux下使用fork()创建进程、并使用exec族函数来加载新进程的映像。同时,也可以试验wait()函数的作用。
提交源代码并将实验结果的截图上传。

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(void){
	pid_t pid = fork();
	if(pid < 0){
		fprintf(stderr, "Fork Failed.\n");
		return 1;
	}else if(pid == 0){
		printf("Child Start~\n");
		execlp("/bin/ls", "ls", NULL);
		printf("Child Complete~\n"); //经过上面一行代码,此行不运行,已跳出.
	}else{
		wait (NULL);
		printf("Father Complete~\n");
	}
	return 0;
}

输出的提示语句可以自行更改, “execlp” 中的指令也可以更改自己喜欢的.
好了,抄作业的同学看到这里就可以了


下面是学写进程过程中个人总结.
“fork()” 的进程数是 2^n 个.
三个 “if” 语句分别代表 (pid < 0) 建立进程失败. (pid == 0) 进入执行子进程. (pid > 0) 进入执行父进程.

由 “fork()” 函数建立的进程,肯定是先进入父进程再进入子进程. 所以如若父进程中没有 “wait()” 函数语句,那么执行顺序一定是先执行完父进程中的语句,再执行子进程中的语句. 那么我们在父进程中式得不到子进程的返回值.
子进程通过 “exit()” 语句给予父进程一个返回值. (返回值最大为255, 并为此循环.
“if(WIFEXITED(status))” 语句的作用是用来指出子进程是否为正常退出的.
而 “WEXITSTATUS(status)” 则是取回子进程的返回值.

关于进程号的获取:
“getpid()” 函数的作用是作为返回值获取当前进程的进程号.
“getppid()” 函数的作用是作为返回值获取当前进程父进程的进程号.
“pid” 就是当前进程的子进程的进程号.

“exec族函数来加载新进程的映像” 的意思是使用 “exec” 语句替换当前进程. 使用了 “exec” 语句,那么在该进程中 “exec” 语句后的语句都不会执行. (用exec函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的PID.

--over

  • 14
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值