进程间通信--两个进程操作同一个文件
.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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。