如何创建一个针对农产品销售的高效网站?
摘要:用于做网站的软件,农产品销售网站建设方案,泉州建站方案,软件开发外包公司是干嘛的目录 1. 进程终止场景 1.1 进程退出码 1.2 进程常见退出方式 2. 进程等待 2.1 进程等待的必要性 2.2 进程等待的方式 wait()方式 wa
用于做网站的软件,农产品销售网站建设方案,泉州建站方案,软件开发外包公司是干嘛的目录
1. 进程终止场景
1.1 进程退出码
1.2 进程常见退出方式 2. 进程等待
2.1 进程等待的必要性
2.2 进程等待的方式
wait()方式
waitpid()方式
options参数
status参数 1. 进程终止场景 代码运行完毕#xff0c;结果正确 代码运行完毕#xff0c;结果不正确 代码异…目录
1. 进程终止场景
1.1 进程退出码
1.2 进程常见退出方式 2. 进程等待
2.1 进程等待的必要性
2.2 进程等待的方式
wait()方式
waitpid()方式
options参数
status参数 1. 进程终止场景 代码运行完毕结果正确 代码运行完毕结果不正确 代码异常终止 进程终止也就是我们通常理解的进程退出了但是我们又怎样理解上面的三句话呢什么叫做代码运行完毕结果正确或者不正确难道是我们每一次都需要自己去调试有或则是每一个都需要通过IO接口将程序结果调试出来然后在判断程序是否正确答案很明显不是的往下将会给你结果。
1.1 进程退出码 首先咱们得明白一个概念判断是一个代码运行完毕结果是否正确肯定不会是我们之前所想的那样将程序以printf、cout或者调试的方法用认为的方式判断是否正确因为对于计算机而言我们判断是否正确根本没有意义因为它的运行速度太快了如果有其它进程需要这个进程的退出信息难道它会等我们告知一个答案吗不会的。所以编程语言出现了——进程退出码。 大家第一次看到进程退出码可能会认为这是一个很厉害很牛逼的东西其实不是我们平时练习C语言和C时都有用到它只是大伙不知道到底是干嘛的罢了。如下 int main() { return 0; } 上方代码的0就是进程退出码之一表示程序正确执行是否感到了一丝丝无语伙伴们是不是以为是什么呢哈哈。不过无语归无语这个知识点却是很多知识点的桥梁还是得认真了解的。 0表示程序执行完了结果正确其余数字都表示结果不正确为什么就因为C语言规定了这玩意你不说谁会懂我举一个例子 假如你和你女朋友说话你女朋友问你“你爱不爱我”你说“0”然后你女朋友就觉得莫名其妙然后再问你“你是不是有病我问你话呢”然后你又回了“3”你女朋友气不过她认为你在耍她最后就气跑了。你冤不冤枉你有好好回答哇只是她不懂哇。 上面这个故事就表明了我不管你是啥我问你东西你就必须得用我知道的方式来回答否则我生气然后把你踢了。所以对于计算机而言我们就是这个女朋友他需要用我们知道的方式来回答所以string.h库中有一个strerror函数可以将我们的进程退出码的信息以文字方式表示出来。如下 1 #includestdio.h 2 #includestdlib.h 3 #includesys/types.h 4 #includestring.h 5 #includeunistd.h 6 7 int main()8 {9 int i 0;10 for(i 0;i130;i)11 {12 printf(我的进程退出码是:%d退出信息是:%s\n,i,strerror(i));13 }14 15 return 0;16 }上述为进程退出码的部分信息可以看到0的退出信息是Success我没骗人吧。我相信大家好好看一下是能看出某些信息自己在写Linux时是看到过的比如说退出码2退出码13。我以退出码为例如下 看到了没知识串起来了以前只是听过Linux是用C语言写的但是不知道是怎么写的但是这里有没有感觉
1.2 进程常见退出方式 1. 从main返回 2. 调用exit 3. _exit 进程退出从main返回的意思就是通过return返回注意只有main函数的返回值才被称为进程退出其它函数的return只是表示这个函数的功能结束了并带回了一个返回值接收到这个返回值的地方依旧是这个进程。 而我们的exit和_exit函数则没有这个限制了它们能够在任意函数结束进程使用方法如下 exit(退出码); _exit(退出码); 这样看起来好像exit函数和_exit函数没有什么区别呢 在大多数情况下这两个函数并没有什么区别但是还是有一定的区别的请先看下图 区别就是_exit是一个系统接口而exit是stdio.h库提供的一个库函数并且exit函数内部调用的_exit函数且exit函数调用没有_exit函数暴力它会先将前面执行的代码运行完了才结束进程而_exit会直接退出进程不管缓冲区的数据等。 int main() { printf(hello world); exit(0); } int main() { printf(hello world); _exit(0); } exit();运行结果 _exit()运行结果 2. 进程等待 进程等待一般出现在父子进程之间父进程等待子进程运行完毕父进程在执行自己的代码。一般是在网络通信连接时有用。
2.1 进程等待的必要性 1. 子进程退出父进程如果不管不顾就可能造成‘僵尸进程’的问题进而造成内存泄漏。 2. 另外进程一旦变成僵尸状态那就刀枪不入“杀人不眨眼”的kill -9 也无能为力因为谁也没有办法杀死一个已经死去的进程。 3. 最后父进程派给子进程的任务完成的如何我们需要知道。如子进程运行完成结果对还是不对或者是否正常退出。 4. 父进程通过进程等待的方式回收子进程资源获取子进程退出信息 上述的概念已经为我们清晰的解释了进程等待的必要性关于僵尸进程就是子进程退出但是父进程没有对它的资源做回收也就是获取进程退出信息那么子进程的进程状态就会变为Z并且一直保持这个状态没有谁能干掉它它就一直占用系统资源。
2.2 进程等待的方式
wait()方式 wait()是一个在sys/wait.h库里面的函数函数声明为 pid_t wait(int*status); 返回值正确为被等待进程pid不正确为-1status参数为输出型参数当我们不关心子进程的退出状态那么就可以将其设置能为NULL。如下
代码 1 #includestdio.h2 #includeunistd.h3 #includesys/wait.h4 #includesys/types.h5 #includestdlib.h6 7 void test1()8 {9 int cnt 5;10 while(1)11 {12 printf(我是子进程我还能活%dS\n,cnt);13 sleep(1);14 --cnt;15 if(cnt 0)16 exit(110);17 }18 }19 20 21 int main()22 {23 pid_t id fork();24 if(id 0)25 { 26 test1();27 }28 pid_t subid wait(NULL);29 printf(我是父进程我等待子进程%d完毕\n,subid);30 31 return 0;32 }结果 从代码中能够看到父进程的printf语句在子进程被执行完毕之后才执行了也就表示父进程使用wait函数之后确实处于等待状态也回收了子进程的信息因为wait返回了正确的pid。
waitpid()方式 waitpid()是在sys/types.h库和sys/wait.h库中的函数声明为 pid_t waitpid(pid_t pid, int *status, int options); 返回值 当正常返回的时候waitpid返回收集到的子进程的进程ID 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在 参数 pid Pid-1,等待任一个子进程。与wait等效。 Pid0.等待其进程ID与pid相等的子进程。 status: WIFEXITED(status): 若为正常终止子进程返回的状态则为真查看进程是否是正常退出 WEXITSTATUS(status): 若WIFEXITED非零提取子进程退出码。查看进程的退出码 options: WNOHANG: 若pid指定的子进程没有结束则waitpid()函数返回0不予以等待。若正常结束则返回该子进程的ID。 该函数的使用方式和wait函数基本一致但是它的参数options、和两个函数都有的status输出型参数我需要为大家讲解一下。
options参数 当我们将其输入为0时此时函数的功能就是进程等待模式也就是上述图中的模式但是如果我们将其输入为WNOHANG那么函数的功能就会变为轮询式等待什么意思呢先看代码 1 #includestdio.h2 #includeunistd.h3 #includesys/wait.h4 #includesys/types.h5 #includestdlib.h6 7 void test1()8 {9 int cnt 5;10 while(1)11 {12 printf(我是子进程我还能活%dS\n,cnt);13 sleep(1);14 --cnt;15 if(cnt 0)16 exit(110);17 }18 }19 20 21 int main()22 {23 pid_t id fork();24 if(id 0)25 { 26 test1();27 }28 int status 0;29 pid_t subid waitpid(id,status,WNOHANG);30 printf(我是父进程我不想等子进程了先运行了之后在回收资源\n);31 return 0;32 }上图中可以看出我们通过WNOHANG参数父进程就没有等到子进程执行完了再执行代码而是先运行着自己的代码子进程自己跑。我将一个故事大家大概就能懂了。 小明和小芳是一对好朋友一天小明想要邀请小芳一起出去玩然后呢他就打电话给小芳问她现在能不能出去小芳说等等我我在洗澡呢小明说好我等你电话别挂。然后电话就一直打着15分钟后小芳说我好了。然后挂断了电话小明和小芳就一起出去了。——————进程等待 还是小明和小芳同样小明想要邀请小芳出去玩小芳也还在洗澡小明打电话问还在洗吗小芳说嗯。然后电话挂了小明洗了个脸大概一分钟又问还在洗小芳说嗯。如此循环直到小芳说出洗完了才不会继续打电话问了。——————轮询式等待 上述的两个故事就对应了我们进程的等待方式。小明就是父进程、小芳就是子进程。
status参数 什么叫做输出型参数呢输出型参数就是指我们只需要传一个地址进入就行然后其它函数拿到这一个空间对其进行数值修改在原函数就能拿到这个值了。 status是一个整型变量他也是一个位图意思就是他用一个变量存了进程退出码和异常信息的值它的高16位没有被使用次高8位用于存进程退出码低7位用于存异常信息还有第8位用于存core dump信息。如下 printf(我是父进程子进程的退出码为%d异常信息为%d\n(status8)0xFF,status0x7F); 该方式就是我们的位图使用方式就是位运算。 值得一提的是当子进程有一个错误那么就不会有退出码也就是说——程序无异常-程序执行是否正确。 n / 0; 错误语句 程序崩溃子进程没有成功运行退出码为0异常信息为8。 以上就是我对进程终止和进程等待的全部理解了还请大家多多支持哇谢谢。
