
#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脚本“多进程”执行模式下,起到一些特殊控制的作用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)