进程【2】-理解进程fork的使用


前言

提示:要解决以下问题:

  1. 使用fork创建的子程序,真的一模一样吗?

一、使用fork创建的子程序,真的一模一样吗?

要理解fork()的诀窍是,但调用完毕fork()将存在两个进程,都会从fork()的返回处继续执行。
而子进程是对父进程栈段,数据段,堆段内存相应各部分的完全复制

二、父子进程间文件共享

由1可知,子进程会继承父进程各个内存段的数据,那么同时也会继承父进程的文件描述符,同时也指向了同一个文件,并会互相影响。

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    int fd,flags;
    char template[] = "/tmp/testXXXXXX";
    setbuf(stdout, NULL);

    fd = mkstemp(template);
    if (fd == -1)
        exit(1);
    
    printf("File offset before fork(): %lld\n",(long long)lseek(fd,0,SEEK_CUR));
    flags = fcntl(fd,F_GETFL);
    if (flags == -1)
        exit(1);
    printf("O_APPEND flag befor fork() is:%s\n",(flags & O_APPEND)?"ON":"off");
    switch (fork())
    {
    case -1:
        exit(1);
    case 0: 
        if (lseek(fd,1000,SEEK_SET) == -1)
            exit(1);
        
        flags = fcntl(fd,F_GETFL);  /*获取目前的标志*/
        if (flags == -1)
            exit(1);
        flags |= O_APPEND;          /*turn O_APPEND on*/
        if (fcntl(fd,F_SETFL,flags) == -1)
            exit(1);
        _exit(EXIT_SUCCESS);
    
    default:            /*父进程能看到由子进程制造的改变*/
        if (wait(NULL) == -1) /*等待子进程退出*/
            exit(1);
        printf("Child has exitd\n");
        printf("File offset in parent:%lld\n",(long long)lseek(fd,0,SEEK_CUR));
        flags = fcntl(fd,F_GETFL);
        if (flags == -1)
            exit(1);
        printf("O_APPEND flag in parent is:%s\n",(flags & O_APPEND)?"on":"off");
        exit(EXIT_SUCCESS);
        break;
    }
    return 0;
}
>>> a.out 
File offset before fork(): 0
O_APPEND flag befor fork() is:off
Child has exitd
File offset in parent:1000
O_APPEND flag in parent is:on

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值