Linux wait()系统调用

Linux wait()系统调用,第1张

进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

#include <unistd.h>

#include <signal.h>

#include <stdio.h>

int pid1, pid2

main()

{

int fd[2]

char outpipe[100],inpipe[100]

pipe(fd)

while((pid1=fork())==-1)

if(pid1==0) //子进程1

{

lockf(fd[1],1,0)

sprintf(outpipe,"child 1 process is sending a message!")

write(fd[1],outpipe,50)//子进程1写数据到管道

sleep(5)

lockf(fd[1],0,0)

exit(0)

}

else //父进程

{

while((pid2=fork())==-1)//创建子进程2

if(pid2==0) //子进程2执行

{

lockf(fd[1],1,0)/*mutex*/

sprintf(outpipe,"child 2 process is sending a message!")

write(fd[1],outpipe,50)//子进程2向管道写数据

sleep(5)

lockf(fd[1],0,0)

exit(0)

}

else //父进程

{

wait(0)//等待子进程结束,那就是子进程1先结束了,进程1先创建的写入数据后,延时5s就/结束了

read(fd[0],inpipe,50)//读管道数据

printf("%s\n",inpipe)//输出的是child 1 process is sending a message!

wait(0)////////////////////////////再次等待进程结束,这里等的就是进程2.

read(fd[0],inpipe,50)//读管道数据

printf("%s\n",inpipe)//这里输出 child 2 process is sending a message!

exit(0)

}

}

}

fork()函数的作用是创建一个进程。在应用程序调用fork()函数后,会创建一个新的进程,称做子进程,原来的进程称做父进程。从这以后,运行的已经是两个进程了,子进程和父进程都可以得到fork()的返回值。对于子进程来说,fork()函数的返回值是0,对于父进程来说,fork函数的返回的是子进程的进程号。如果创建进程失败,fork()函数会给父进程返回-1,这也是判断进程是否创建成功的依据

wait是等待,等待前面的所有子进程全部执行完才继续。这里p1=fork(),p2=fork()不是有调用到fork子进程吗

写这个的目的是避免上面的还没执行完就开始执行后续的程序了。

我举个例子,你在执行备份后删除原文件 *** 作,备份还没进行完,程序就开始删除了。这样就会出错了。

当然你这里后续没有 *** 作,wait只是在等待上面的全部做完然后退出整个程序。

1、启动后台子任务,在执行命令后加& *** 作符,表示将命令放在子shell中异步执行。可以达到多线程效果。如下,sleep10#等待10秒,再继续下一 *** 作sleep10当前shell不等待,后台子shell等待。

2、wait命令wait是用来阻塞当前进程的执行,直至指定的子进程执行结束后,才继续执行。使用wait可以在bash脚本“多进程”执行模式下,起到一些特殊控制的作用。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7224742.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存