unix高级编程-fork之后父子进程共享文件

简介: unix高级编程-fork之后父子进程共享文件

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

这里我看到的是centos的操作,但我用的是debian系的ubuntu,百度了一下发现debian的在这里

我们进文件看下

这里执行的是.bashrc这个文件

这里可以吧系统编码改成可以识别中文的

export LC_ALL=zh_CN.UTF8

export LANG=$LC_ALL

大家可以自行修改想要的编码,修改完重新执行一下用户文件,或者重启,或者重新登陆都是可以的

文件共享

我们要用open函数

我们这里用man查看手册

linux自带的工具 man 手册

man 1 是普通shell 的命令 比如 ls

man 2 是系统 调用函数 open write 说明

比如 查看 open 函数 :man 2 open

我们把包含的库文件粘贴上去

open打开文件参数

我们放两个参数就可以了,第一个是文件指针(打开文件的路径),flags我们查看man手册,我们取O_RDWR读写属性

注意这里的文件流返回值int

我们再看下状态码

-1就是出错的

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{    
    int fd;
    fd = open("./1.txt",O_RDWR);
    if(fd == -1)
    {
         printf("打开文件失败!\n");
         return -1;       
    }
    else{
        printf("打开文件成功\n");    
    }
    return 0;
}

可以发现这里报错了

这里是因为open文件并不能创建

我们创建文件然后运行

write函数写入

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int main(void)
{    
    int fd;
    fd = open("./1.txt",O_RDWR);
    if(fd == -1)
    {
         printf("打开文件失败!\n");
         return -1;       
    }
    else{
        printf("打开文件成功\n");    
    }
    pid_t pid;
    pid = fork();
    if(pid == -1)
    {    
        printf("pid<0 err.\n");
        return -1;
    }
    else if(pid == 0)
    {    
        printf("child:%d,parent:%d\n",getpid(),getppid());
        write(fd,"parent",6);   
    }
    else if(pid > 0){
        write(fd,"child",5);
        printf("Parent Process id: %d\n",getpid());
        wait(NULL); //等待子进程结束,再返回,()里面参数一般是空指针
      }
    return 0;
}

执行完毕我们可以看到两个进程都向这个文件写入数据了

我们用for语句多写入几行

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int main(void)
{    
    int fd;
    fd = open("./1.txt",O_RDWR);
    if(fd == -1)
    {
         printf("打开文件失败!\n");
         return -1;       
    }
    else{
        printf("打开文件成功\n");    
    }
    pid_t pid;
    pid = fork();
    if(pid == -1)
    {    
        printf("pid<0 err.\n");
        return -1;
    }
    else if(pid == 0)
    {    
        for(int i =0 ;i<1000;i++){
            write(fd,"parent  ",8);    
        }  
        printf("child:%d,parent:%d\n",getpid(),getppid());
        write(fd,"parent",6);   
        close(fd);         
    }
    else if(pid > 0){
        for(int i =0 ;i<1000;i++){
            write(fd,"child  ",7);    
        }        
        printf("Parent Process id: %d\n",getpid());
        wait(NULL); //等待子进程结束,再返回,()里面参数一般是空指针
      }
    close(fd);
    return 0;
}

可以看到并发执行写入的顺序不可控,且是共享的

注意这里又两个写入流子进程和父进程都需要close(fd)

相关文章
|
4天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
44 13
|
2月前
|
算法 Unix 数据安全/隐私保护
Python编程--UNIX口令破解机
Python编程--UNIX口令破解机
28 1
|
3月前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
3月前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
39 4
|
3月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
3月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
3月前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
3月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
3月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
3月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。