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

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 [email protected] -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;
}

时间: 2024-08-27 07:21:31

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

xcode对比两个分支中同一个文件

对于同一个项目的两个分支,因为两个分支可能各自都做了一些修改,所以通过Source Control中的History...功能是无法查看的,如下图: 这个时候,我们需要用到xcode的另外一个功能,如图: 操作步骤: 1.点击图中标注为1红框中的按钮,中间的界面会出现并排的两个窗口3和4(窗口3为当前分支文件内容). 2.从另外一个分支的xcode窗口中选中同名的文件,然后使用"command+`"切换到当前的xcode窗口. 3.拖动文件到图片中标注2红框中的位置,窗口4即为拖动过来

LINUX实现父子进程轮流修改文件的值

本例子是基于信号的同步机制实现父子进程轮流修改文件中的值. tatic volatile sig_atomic_t sigflag; static sigset_t newmask,oldmask,zeromask; static void sig_usr(int signo) { sigflag=1; } void TELL_WAIT(void) { if(signal(SIGUSR1,sig_usr)==SIG_ERR) perror("signal error"); if(sig

进程间传递文件描述符

下面的实例展示了如何使用Unix域套接字在进程间传递文件描述符 参考文献:1) <Unix网络编程> 2)  http://book.51cto.com/art/200912/168560.htm 最近学习了使用Unix域套接字在进程间传递文件描述符,仿照参考资料,自己也写了简单的程序来实践这种技术. 其他不多说了,具体理论知识参见参考资料,开始我自己的程序介绍(在OpenSolaris 2009.06平台上测试): 1  程序作用说明:父进程,子进程以及另外一个进程向同一个文件的文件描述符向

C/C++ 父子进程之间的文件描述符问题

在C程序中,文件由文件指针或者文件描述符表示.ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符.下面重点来说下,文件描述符是如何工作的. 文件描述符相当于一个逻辑句柄,而open,close等函数则是将文件或者物理设备与句柄相关联.句柄是一个整数,可以理解为进程特定的文件描述符表的 索引.先介绍下面三个概念,

避免同一个文件被include多次的方法

C/C++中有两种方式避免同一个文件被include多次 一种是#ifndef方式,一种是#pragma once方式: 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明.定义语句 #endif 方式二: #pragma once ... ... // 声明.定义语句 #ifndef的方式受C/C++语言标准支持.它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包

PHP多个进程同时写入同一个文件

flock (PHP 3 >= 3.0.7, PHP 4, PHP 5) flock -- 轻便的咨询文件锁定 说明 bool flock ( int handle, int operation [, int &wouldblock] ) PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法. 注: 在 Windows 下 flock() 将会强制执行. flock() 操作的 handle 必须是一个已经打开的文件指针.operat

Linux下查看哪个进程对某文件进行了操作

由于工作需要,近日开发了一个server agent,其中有个功能是对/path/to/file文件进行写入 在程序部署完成后,/path/to/file文件中内容刚开始是符合预期的 但是过了不到一分钟,发现/path/to/file已与预期不符,走查代码后确认无误,怀疑是有其他后台进程对此文件进行了修改,所以要查到这个元凶巨恶 起初,尝试使用lsof命令,具体说来,清空/path/to/file文件内容,然后写一个无限循环调用lsof /path/to/file,运行后发现无任何效果,但/pa

利用内存映射文件在两个进程间共享数据 转

private hMapFile: THandle; MapFilePointer: Pointer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin hMapFile := CreateFileMapping ( $FFFFFFFF, // 特殊内存映射句柄 nil, page_

由于出现操作系统错误 3,进程无法读取文件D:\XXXX\X.pre (源: MSSQL_REPL,错误号: MSSQL_REPL20024)

今天在服务器做发布+订阅的时候出现了一个问题,如下: 由于出现操作系统错误 3,进程无法读取文件“D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\ReplData\unc\USER-N18O5DGQU6_CLOUDTRADB_GYPT_GYPT_F\20151127091512\fn_diagramobjects_129.pre”. (源: MSSQL_REPL,错误号: MSSQL_REPL20024)获取帮