点击(此处)折叠或打开
-
/**************************************************
-
* 功能:在fork之前用文件IO打开文件,然后创建子进程
-
* 父进程循环从键盘读入数据写入到文件,子进程
-
* 循环从文件中读取数据,并且打印到屏幕,如果
-
* 父进程输入“quit”,父子进程结束。
-
**************************************************/
-
#include <stdio.h>
-
#include <string.h>
-
#include <errno.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
#include <stdlib.h>
-
-
#define N 100
-
-
int parent_do(int fd)
-
{
-
char buf[N] = {0};
-
int n = 0;
-
-
while(1)
-
{
-
putchar('>');
-
-
fgets(buf,sizeof(buf),stdin);
-
-
//去掉'\n',注意实际读取的字符个数为strlen(buf)
-
//比如输入abc回车,则buf中会读取到'a','b','c','\n'
-
//此时存储了字符'\n',需要手动把'\n'替换为'\0'
-
buf[strlen(buf) - 1] = '\0';
-
-
//实际写入文件的字符个数为n
-
n = write(fd,buf,strlen(buf));
-
-
//注意此次写操作会改变文件表项中的offset值,需要手动把
-
//把offset的值设置到文件的开头,以免子进程读取不到字符
-
lseek(fd,-n,SEEK_CUR);
-
-
//此时睡眠200ms是为了让子进程执行
-
usleep(20000);
-
-
if(strncmp(buf,"quit",4) == 0)
-
{
-
break;
-
}
-
}
-
-
return 0;
-
}
-
-
int child_do(int fd)
-
{
-
char buf[N] = {0};
-
int n = 0;
-
-
while(1)
-
{
-
n = read(fd,buf,sizeof(buf));
-
buf[n] = '\0';
-
-
if(n == 0)
-
{
-
continue;
-
}
-
-
printf("%s\n",buf);
-
-
if(strncmp(buf,"quit",4) == 0)
-
{
-
break;
-
}
-
}
-
-
return 0;
-
}
-
-
-
int main(int argc, const char *argv[])
-
{
-
int fd = 0;
-
pid_t pid = 0;
-
-
if(argc < 2)
-
{
-
fprintf(stderr,"Usage %s filename",argv[0]);
-
exit(EXIT_FAILURE);
-
}
-
-
//fork之前打开文件,父子进程共用同一个文件表项(offset)
-
if((fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0666)) < 0)
-
{
-
fprintf(stderr,"Fail to open %s : %s.\n",argv[1],strerror(errno));
-
exit(EXIT_FAILURE);
-
}
-
-
if((pid = fork()) <0)
-
{
-
perror("Fail to fork");
-
exit(EXIT_FAILURE);
-
}
-
if(pid > 0)
-
{
-
parent_do(fd);
-
}
-
-
if(pid == 0)
-
{
-
child_do(fd);
-
}
-
-
close(fd);
-
-
return 0;
- }
点击(此处)折叠或打开
-
litong@ltubuntu:~/exericse$ ./a.out test.txt
-
>ls
-
ls
-
>ls
-
ls
-
>pwdkjsklfj
-
pwdkjsklfj
-
>ksjfsklj
-
ksjfsklj
-
>quit
-
quit
-
litong@ltubuntu:~/exericse$ cat test.txt
-
lslspwdkjsklfjksjfskljquitlitong@ltubuntu:~/exericse$
-
litong@ltubuntu:~/exericse$ cat test.txt
-
lslspwdkjsklfjksjfskljquitlitong@ltubuntu:~/exericse$ gcc fork_pr_cw.c
-
litong@ltubuntu:~/exericse$ ./a.out test.txt
-
>pwd
-
pwd
-
>ls
-
ls
-
>abcdesqui
-
abcdesqui
-
>quit
-
quit
- litong@ltubuntu:~/exericse$