有时候父进程要求子进程的运算结果进行下一步的运算,或者子进程的功能是为父进程提供下一步执行的先决条件,此时父进程就必须在某个位置停下来,等待子进程运行结束,而如果父进程不等待且直接执行下去,就会出现极大的混乱。可以用wait或waitpid函数来解决这个问题。
下面就是父子进程同步的一个实例,子进程进行写操作,父进程读出子进程写的内容
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* 子进程写操作 */
void ChildWrite()
{
int fd, ret;
char buf[100] = {0};
fd = open("hello.txt", O_WRONLY | O_CREAT | O_EXCL, S_IRWXU); //子进程以只写方式打开一个hello.txt的文件,若不存在则创建
if(-1 == fd) //打开文件失败
{
perror("open1");
exit(1);
}
while(1) //死循环可以让子进程不停地进行写操作
{
scanf("%s",buf);
ret = write(fd, buf, strlen(buf)); //往fd里写长度为strlen(buf),内容为buf的东西
if(-1 == ret) //写操作失败
{
perror("write");
exit(1);
}
if(!strncmp(buf, "end", 3)) //写操作以end结束并退出循环
{
break;
}
}
memset(buf, 0, sizeof(buf)); //清空缓冲区
}
/* 父进程读操作 */
void ParentRead()
{
int fd, ret;
char buf[100] = {0};
fd = open("hello.txt", O_RDONLY); //以只读方式打开文件
if(-1 == fd)
{
perror("open2");
exit(1);
}
while(1)
{
ret = read(fd, buf, sizeof(buf)); //从fd中读出长度为sizeof(buf)的内容,读到buf
if(-1 == ret)
{
perror("read");
exit(1);
}
else if(0 != ret) //防止父进程一直读到空(子进程并没有写操作的情况下)到缓冲区buf
{
if(!strncmp(buf, "end", 3)) //读操作也是以end结束并跳出循环
{
break;
}
printf("Read from txt: %s\n", buf); //从缓冲区把数据读出来(打印到屏幕)
}
memset(buf, 0, sizeof(buf)); //清空缓冲区
}
}
int main()
{
pid_t pid;
pid = fork();
if (pid == -1)
{
perror("fork");
exit(1);
}
else if(0 == pid) //子进程执行部分
{
ChildWrite();
}
else //父进程执行部分
{
ParentRead();
waitpid(pid, NULL, 0); //父进程必须等待子进程,实现进程同步
}
return 0;
}