### Linux 利用进程向文件中写入并输出1~100 #### 背景与需求 在Linux环境中,进程间通信(IPC)是非常重要的一个方面,它允许不同的进程之间交换数据或同步执行。本示例通过使用`fork()`函数创建两个进程:父进程负责创建一个文件并将数字1到100写入该文件,每10个数字换一行;子进程则负责读取文件内容并按同样的格式输出。 #### 涉及的关键技术点 1. **fork()**:用于创建一个新进程。新进程称为子进程,而调用`fork()`的进程称为父进程。 2. **open()**:用于打开或创建一个文件,并返回一个文件描述符。该函数可以指定文件的操作模式。 3. **write()**:用于将缓冲区中的数据写入文件描述符所对应的文件中。 4. **read()**:用于从文件描述符所对应的文件中读取数据到缓冲区。 5. **close()**:用于关闭一个文件描述符。 6. **wait() 或 waitpid()**:等待子进程结束并回收资源。 #### 代码解析 ```c #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, char *argv[]) { int p_id; int fd; int i; unsigned char buf[100]; // 初始化数组buf为1到100 for (i = 0; i < 100; i++) { buf[i] = i + 1; } // 创建子进程 if ((p_id = fork()) == 0) { // 子进程 fd = open("/tmp/test", O_RDWR); // 以读写方式打开文件test int size = read(fd, buf, sizeof(buf)); // 读取文件到buf for (i = 0; i < size; i++) { printf("%d", buf[i]); if ((i + 1) % 10 == 0) // 每10个数字换行 printf("\n"); else printf(" "); // 其他情况下添加空格分隔 } close(fd); } else if ((p_id = fork()) == -1) { // 错误处理 printf("Failed to fork a process!\n"); exit(-1); } else { // 父进程 fd = open("/tmp/test", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); // 以读写方式创建文件 if (fd) { write(fd, buf, sizeof(buf)); // 将buf中的数据写入文件 close(fd); } } return 0; } ``` #### 分析 1. **初始化buf数组**:将buf数组的每个元素初始化为1到100的整数。 2. **创建子进程**:使用`fork()`函数创建一个新的子进程。 3. **子进程操作**: - 打开文件`/tmp/test`以读写模式。 - 读取文件内容到`buf`数组。 - 输出`buf`数组中的数字,每10个数字后换行。 4. **父进程操作**: - 使用`O_RDWR | O_CREAT`模式创建文件`/tmp/test`,权限为用户可读写。 - 将`buf`数组中的数字写入文件。 #### 总结 这个示例展示了如何在Linux环境下使用基本的系统调用来实现进程间的简单通信。父进程负责创建文件并写入数据,而子进程则负责读取这些数据并按特定格式输出。这种简单的IPC模型是理解更复杂IPC机制的基础,例如管道、信号量、消息队列等。通过实践这类基础示例,开发者可以更好地理解和掌握Linux进程间通信的核心概念和技术。
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int p_id;
int fd;
int i;
unsigned char buf[100];
for(i=0;i<100;i++)
{
buf[i]=i+1;
}
if((p_id=fork())==0)
{
fd=open("/tmp/test",O_RDWR);//以读写方式打开test文件
//read函数会吧fd所指的问价传送sizeof(buf)个字节到buf所指的内存中
int size=read(fd,buf,sizeof(buf));
for(i=0;i<size;i++)
{
printf("%d",buf[i]);
printf(" ");
if((i+1)%10==0)
- xqs20112013-07-09还不错,对我有帮助
- liu425804102014-06-04不错 对我帮助很大
- 粉丝: 30
- 资源: 18
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助