プロセス間通信:2つのプロセスが同じファイルを操作

2332 ワード

a.txtファイルの内容は以下の通りです.
hello,world.
2つの異なる実行可能プログラムを作成し、名前はそれぞれ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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main()
{
    printf("a begin
"); int fd = open("a.txt", O_RDONLY); if (fd == -1)// { printf("error is %s
", strerror(errno)); return -1; } pid_t pid = fork();//fork , if (pid < 0) { printf("fork failed %s
", 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
", strerror(errno)); } } printf("a end..
"); return 0; }

b.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int arg, char *args[])
{
	printf("b begin..
"); if (args[1] == NULL)//b , ,main { printf("Usage: b xxx
"); 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..
"); return 0; }