进程间通信--两个进程操作同一个文件

a.txt文件内容如下:

hello,world。

编写两个不同的可执行程序,名称分别为a和b。在a程序中调用open函数打开a.txt文件,在b程序不可调用open或者fopen。只允许调用read函数来实现读取a.txt文件(a程序中可以使用fork和execv函数创建子进程)。

makefile

.SUFFIXES: .c .o
CC=gcc
SRCS=a.c

OBJS=$(SRCS:.c=.o)
EXEC=a
all: $(OBJS)
    $(CC) -o $(EXEC) $(OBJS)
    @echo '-------------ok--------------'
.c.o:
    $(CC) -Wall -g -o $@ -c $<
clean:
    rm -f $(OBJS)
    rm -f core*

a.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
    printf("a begin\n");
    int fd = open("a.txt", O_RDONLY);
    if (fd == -1)//打开文件失败
    {
        printf("error is %s\n", strerror(errno));
        return -1;
    }
    pid_t pid = fork();//fork调用,在内存中克隆一个与自己一样的副本
    if (pid < 0)
    {
        printf("fork failed %s\n", strerror(errno));
        return -1;
    }
    if (pid > 0)//父进程
    {
        close(fd);//父进程关闭打开的文件描述符fd
    }
    if (pid == 0)//子进程
    {
        char s[128];
        memset(s, 0, sizeof(s));
        sprintf(s, "%d", fd);//将打开a.txt文件后的文件描述符fd格式化为字符串
        char *args[] = { "b", s, NULL };
        if (execve("b", args, NULL) == -1)//将文件描述符fd作为启动参数传递给b程序
        {
            printf("execve failed %s\n", strerror(errno));
        }
    }
    printf("a end..\n");
    return 0;
}

b.c

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

int main(int arg, char *args[])
{
	printf("b begin..\n");
	if (args[1] == NULL)//b启动的时候,如果没有参数,main函数直接退出
	{
		printf("Usage: b xxx\n");
		return -1;
	}
	int fd = atoi(args[1]);//将第一个参数从字符串转化为整数,此参数就是文件描述符fd
	if (fd == 0)//如果参数为0,函数返回
	{
		return -1;
	}
	char buf[1024];
	memset(buf, 0, sizeof(buf));
	read(fd, buf, sizeof(buf));//读取文件
	printf("%s", buf);
	close(fd);//关闭文件描述符
	printf("b end..\n");
	return 0;
}
时间: 2025-01-13 14:28:47

进程间通信--两个进程操作同一个文件的相关文章

Linux文件共享(二)——两个独立进程打开同一个文件

如果两个独立进程各自打开了同一文件,则有图3-2中所示的安排.我们假定第一个进程使该文件在文件描述符3上打开,而另一个进程则使此文件在文件描述符4上打开.打开此文件的每一个进程都得到一个文件对象,但对一个给定的文件只有一个v节点表项.每个进程都有自己的文件对象的一个理由:这种安排使每个进程都有它自己对该文件的当前位移量.这种情况不会增加对应的打开文件引用计数,而会增加dentry的引用.          给出了这些数据结构后,现在对前面所述的操作作进一步说明. (1) 在完成每一个write后

Linux文件共享(一)——进程与打开文件

Linux支持在不同进程间共享打开文件.为了说明文件共享,先来说明内核用于所有I/O的数据结构. 他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响. 0.1和文件有关的对象 (1) inode(i节点): 保存一个文件的通用信息,每个inode有一个inode number,在文件系统中,一个inode number能够唯一地标识一个文件. (2) dentry(目录项对象):每个dentry代表路径中的一个特定部分.保存一个目录的链接信息.个人理解:描述一个文件和一个名字的

两个进程间的数据共享问题

问题描述 问题是这样的,有两个进程(或者更多的进程),启动的时候都从同一个文件读取数据,在各自的进程中建立对象模型.这两个进程还都可以修改数据.那么,问题来了,如果进程A修改了数据,进程B要适时的获得修改后的数据,应该采用什么样的解决方案来实现呢?因为程序的基础通信架构采用的是WCF,考虑过使用WCF进行通信来同步两个进程间的数据,但设计到的数据维度比较多,如果每一个属性的修改都需要来一次通信的话,这样肯定对性能就会产生很大的影响了.不知道,各位大神是否有更好的方案,烦请赐教!!!谢谢!!! 解

隐藏任意进程、目录/文件、注册表、端口

查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation,ZwXXXValueKey 等函数.要想拦截这些函数达到隐藏目的,需先自己实现以上函数,并修改系统维护的一个SYSCALL 表使之指向自己预先定义的函数.因 SYSCALL 表在用户层不可见,所以要写 DRIVE 在 RING 0 下才可修改.关于如何修改已有文章详细介绍过,这里不在详述.(可以参见 sysinternals.com 或 WebCrazy

拷贝-同一个文件夹里有多个图片要复制到另一个文件夹,要怎么做

问题描述 同一个文件夹里有多个图片要复制到另一个文件夹,要怎么做 首先我要能让系统得到每一张图片的名字,这样就可以用file.copy(源图片,目标图片,ture)将图片拷贝到另一个文件夹了,但问题是这样操作一张图片很简单,但是文件夹里有很多图片,我怎么得到每一张图片的名字并能分离开每一个图片名称?不知道描述的意思大神能懂吗 望助 解决方案 直接传入两个目录名,就可以. public void CopyDirectory( string sourceDirName, string destDir

请问我要怎么把两个.net 放在同一个空间下

问题描述 请问我要怎么把两个.net 放在同一个空间下 (1)将多个项目放到不同的文件夹中(2)将多个项目的bin文件夹的 dll 文件放到根目录的 bin 文件夹中 (3)第二个config删除了的我这样做了但还是不行 第一个能够正常访问第二个不能进入后台操作提示 无法将类型为"xxx.Model.siteconfig"的对象强制转换为类型"xxxx.Model.siteconfig".我要怎么改呢 解决方案 你的意思是将多个.net项目放到一个命名空间下吗?

请教多线程操作同一个数据表时,怎么避免表死锁

问题描述 最近有一个数据采集的项目,要求可以多路并发,遇到多线程操作同一个数据表的问题,经常发生表死锁,求各位大侠帮忙,大约有20-40个进程实例化读取类,类中Receive方法接收数据并存储上代码publicclassclsTranslateObj{privatevoidReceive(){intlenReceive=0;byte[]receivedByte=newbyte[BUFFER_SIZE];//接收返回字节数组_rtnStr=string.Empty;while(_flgConnec

python 文件操作api(文件操作函数)_python

python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录:os.removedirs(r"c:\python") 检验给出的路径是否是一个文件:os.path.isfile() 检验给出的路径是否是一个目录:os.path.isdir() 判断是否是绝对路

C语言的fork函数在Linux中的进程操作及相关面试题讲解_C 语言

fork的意义 下图为,C 程序的存储空间布局(典型) 1.一个现有进程可以调用 fork 函数创建一个新进程. 2.fork 函数被调用一次,但返回两次, 两次返回的唯一区别是子进程的返回值是 0, 而父进程的返回值是新子进程的 PID. 3.子进程和父进程继续执行 fork 调用之后的指令. 在上图的存储空间布局中,父子进程只共享正文段,其余的都各自有独立的副本 (通常使用 copy-on-write 的策略,速度比较快). fork 的两种用法 1.父子进程同时执行不同的代码段典型应用:W