/* 创建一个进程 */
#include "Process.h" /* 自己写的头文件 */
int main()
{
pid_t pid;
printf("Fork pid:%d\n",getpid());
pid = fork();
if(-1 == pid)
{
perror("fork");
exit(1);
}
else if(0 == pid)
{
printf("Child Process!\n");
printf("Child Pid:%d \n",getpid());
}
else
{
printf("Parent Process!\n");
printf("Parent Pid:%d \n",getpid());
waitpid(pid,NULL,0); //确保父进程后结束
}
return 0;
}
/* 1.在以上的程序中经过多次执行,有时候会出现父进程
先执行,造成子进程变成孤儿进程?该如何解决? */
/* 解决方法:使用 waitpid(); 函数,确保父进程后结束 */
/* 2.进过多次执行,可以发现 子进程号 与 父进程号 是连在一起的.
且子进程号 比 父进程号 大1 */
/* fork2.c */
/* fork 创建的子进程 与 父进程 到底有什么关系呢 ? */
#include "Process.h" //自己写的头文件
int main()
{
pid_t pid;
int count = 0;
pid = fork();
if(-1 == pid) //返回值为-1,判断出错
{
perror("fork");
exit(1);
}
else if(0 == pid) //返回值为0,判断为子进程
{
count++;
printf("Child count :%d \n",count);
}
else //否则,为父进程
{
count++;
printf("Parent count :%d \n",count);
waitpid(pid,NULL,0);
}
return 0;
}
/* 结论: 1.子进程 完全复制 父进程 的资源;
2. "写时复制"
3.子进程 与 父进程 占用不同的虚拟内存空间
*/
/* vfork 创建进程 */
/* 1.vfork 子进程 与 父进程 又有什么关系呢?
2.vfork 与 fork 的区别与联系
*/
#include "Process.h"
int main()
{
pid_t pid;
int count = 0;
pid = vfork();
if(-1 == pid)
{
perror("vfork");
exit(1);
}
else if(0 == pid)
{
printf("Child Process! \n");
count++;
printf("Child count :%d \n",count);
exit(2); //子进程需手动退出
}
else
{
printf("Parent Process!\n");
count++;
printf("Parent count :%d \n",count);
}
return 0;
}
/* vfork的特点:
1.子进程需要手动退出 (与fork不同)
2.每次都是子进程先执行, 父进程后执行 (与fork不同)
3.创建的 子进程 与 父进程 共享空间 (与fork不同)
4.当然,与fork 的相同点是: 都可以创建进程
*/
/* vfork的案例应用:子进程中另起一个新进程 */
#include "Process.h"
int main()
{
pid_t pid;
pid = vfork();
if(-1 == pid)
{
perror("vfork");
exit(1);
}
else if(0 == pid)
{
printf("Child Pid:%d \n",getpid());
execl("/mnt/hgfs/share/example/Linux/process/fork","./fork",NULL); //另起的进程./fork
}
else
{
printf("Parent Process!\n");
}
return 0;
}
/* vfork 中 子进程另起的进程与子进程 有相同的进程号 */
/* 父进程写 子进程读 */
/* waitpid.c 案例应用 */
#include "Process.h"
void ChildRead()
{
int fd,ret;
char buf[20] = {0};
fd = open("hello.txt",O_RDONLY);
if(-1 == fd)
{
perror("open1");
exit(2);
}
ret = read(fd,buf,sizeof(buf));
if(-1 == ret)
{
perror("read");
exit(3);
}
else
{
printf("Read from txt:%s\n",buf);
memset(buf,0,sizeof(buf));
}
close(fd);
}
void ParentWrite()
{
int fd;
int ret;
char buf[20] = {0};
fd = open("hello.txt",O_CREAT | O_WRONLY);
if(-1 == fd)
{
perror("open2");
exit(4);
}
printf("Please input the string:\n");
scanf("%s",buf);
ret = write(fd,buf,strlen(buf));
if(-1 == ret)
{
perror("write");
exit(5);
}
close(fd);
}
int main()
{
pid_t pid;
pid = fork();
if(-1 == pid)
{
perror("fork");
exit(1);
}
else if(0 == pid)
{
sleep(4);
ChildRead();
}
else
{
ParentWrite();
waitpid(pid,NULL,0);
}
return 0;
}
进程控制篇代码示例(复习)
最新推荐文章于 2022-01-16 16:39:24 发布