UNIX/Linux 是多任务的操作系统,那如何进行多任务处理呢,就是通过多个进程分别处理不同事务来实现
事实上一颗单核CPU,在一个时刻里只能处理一条指令,所以在微观的世界里只可能有一个进程正在运行,那为什么是多任务的操作系统呢,那是由于操作系统将CPU时间分成很多的小时间片,并且将这些时间片分配给不同的任务,然后根据特定的方法在不同任务间进行快速的轮转(每一次切换任务都会对当前任务的进展进行保存,然后提取出下一个任务之前保存的进展,这个切换过程是有一定CPU开销的),而相对于计算机,人的速度非常慢,这样从宏观来看,给人的感觉就好像很多事务在同时推进一样,从而达到多任务或并行处理的效果,而多核的CPU就可以真实地进行并行处理,就好像多条流水线同时开工,在这里每个任务都可以看作是一个进程
上一篇中使用fork进行了子进程的创建,这时子进程还是一份父进程的拷贝,如果要让子进程可以完成父进程不一样的功能,就要用到进程的替换
进程的替换是通过 exec
函数族来实现的
这里分享一下我在学习进程过程中的笔记和心得
process进程:process.c
要求:里面sleep 3秒,要求打印出子进程的PID。
z进程:z.c
要求:每2秒打印一句提示语,循环5次。
z.c
#include <stdio.h>
#include <unistd.h> //sleep函数在这里面声明
int main()
{
int i=0;
for(i=0;i<5;i++)
{
sleep(2);
printf("%d loop...(there are %d times left)\n",i+1,5-i-1);
}
return 0;
}
小程序编译测试
emacs@ubuntu:~/c$ alias gtc
alias gtc='gcc -Wall -g -o'
emacs@ubuntu:~/c$ gtc z.x z.c
emacs@ubuntu:~/c$ ./z.x
1 loop...(there are 4 times left)
2 loop...(there are 3 times left)
3 loop...(there are 2 times left)
4 loop...(there are 1 times left)
5 loop...(there are 0 times left)
emacs@ubuntu:~/c$
编译执行过程中没有报错,从结果来看,符合预期
下面是关键的主程序
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h> //exit 函数在里面声明
int main()
{
pid_t fret=0; //创建一个变量用来存放fork返回值
fret=fork();
if(0 < fret) //如果pe的值大于0,就代表为父进程,fret的值就是子进程的进程号
{
int pid=0,status=0;
sleep(3);
printf("this is the parent process(%d),wait for child(%d)...\n",getpid(),fret);
pid = wait(&status); //使用阻塞模式等待子进程退出
if(-1 != pid ) printf("this is the father process, my pid is %d, child process is %d, the wait return value is %d \n",getpid(),fret,WEXITSTATUS(status)); //再次显示父子进程PID,和子进程退出的状态
else printf("wait error\n");
}
else if(0 == fret) //fork返回值为0的时候代表子进程
{
char *s="/home/emacs/c/z.x"; //定义一个字符指针存放可执行程序的路径
char *c="z.x"; //定义一个字符指针存放可执行文件名
printf ("this is child, pid is :%d, my father pid is %d\n",getpid(),getppid()); //显示父子进程PID信息
execl(s,c,(char *)0); //进行进程替换, use NULL instead of (char *)0
}
else
{
printf("fork error\n");
exit(-1); //直接退出,并且将退出状态设置为-1
}
return 0;
}
emacs@ubuntu:~/c$ alias gtc
alias gtc='gcc -Wall -g -o'
emacs@ubuntu:~/c$ gtc process.x process.c
emacs@ubuntu:~/c$ ./process.x
this is child, pid is :7588, my father pid is 7587
1 loop...(there are 4 times left)
this is the parent process(7587),wait for child(7588)...
2 loop...(there are 3 times left)
3 loop...(there are 2 times left)
4 loop...(there are 1 times left)
5 loop...(there are 0 times left)
this is the father process, my pid is 7587, child process is 7588, the wait return value is 0
emacs@ubuntu:~/c$
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。