プロセス間通信:2つのプロセスが同じファイルを操作
2332 ワード
a.txtファイルの内容は以下の通りです.
hello,world.
2つの異なる実行可能プログラムを作成し、名前はそれぞれaとbである.aプログラムでopen関数を呼び出してa.txtファイルを開き、bプログラムでopenまたはfopenを呼び出すことはできません.read関数のみを呼び出してa.txtファイルの読み取りを実現できます(aプログラムではforkとexecv関数を使用してサブプロセスを作成できます).
makefile
a.c
b.c
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;
}