看了大约5个小时的视频,主要讲Linux下的进程控制初步,主要涉及三个:
1. fork 创建一个新的进程,产生一个新的PID;
2. system调用系统命令
3. execve启动一个新程序,替换原有进程
很不好理解,到下午的时候想到了一些事情,把它们结合起来,会发现入门真的很容易。
先讲第一个fork创建新的进程,看过动画《火影》吧,主角鸣人有2个招牌技能,一个是影分身,一个是螺旋丸,我们就从这里讲起:
以下是Linux上运行的结果:
[]$ make
gcc -o frok1.o -c frok1.c -Wall -g
gcc -o frok1 frok1.o
----------------ok!------------
[]$ frok1
鸣人使用影分身术,产生一个影分身=0!
鸣人使用影分身术
本尊产生螺旋丸!pid = 16886
影分身对螺旋丸加旋转! pid = 16887
本尊螺旋丸------发射!
大概了解了fork(),我们继续来看 system调用和execve之间的差别,应该怎么样来理解:系统
system()调用系统shell来做某些事情,与在 windows下没有太大的差别;但是这个在Linux上基本不用的
<span style="white-space:pre"> </span>int match_time = 0;//主线是一场比赛
<span style="white-space:pre"> </span>pid_t WWE = fork();
<span style="white-space:pre"> </span>if(WWE == 0)//big show在场上是子进程
{
printf("Big show与队友交换上场权!PID=%d \n",WWE);
char *argv[]={"ls",NULL};//传递给执行文件的参数数组,这里包含执行文件的参数
execve("/bin/ls",argv,NULL); //另一个队员上场
printf("无效了?"); //这句命令不会执行,因为场上权限已经交给另一个队员了
}
else
{
for (;match_time<5;match_time++)
{
printf("比赛继续!PID=%d time = %d\n",WWE,match_time);
sleep(1);
}
}
return 0;
结果:
[]$ execve1
比赛继续!PID=18655 time = 0
Big show与队友交换上场权!PID=0
Makefile execve1.c frok1 frok1.o execve1 execve1.o
比赛继续!PID=18655 time = 1
比赛继续!PID=18655 time = 2
比赛继续!PID=18655 time = 3
比赛继续!PID=18655 time = 4
我们再重新拿鸣人举例,比如说鸣人发大招,而大招的条件是献祭(一个影分身);
那么就相当于fork出来的影分身以生命为代价消失了,这个就是execve的用法。总不见得让本尊去献祭吧,这样的话自己的程序就不受控制了~