linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?

本文深入探讨了进程与线程的概念,解释了main函数既是进程也是线程的特性。通过CS游戏实例,清晰阐述了线程如何在进程中并行执行。此外,还详细解析了在Linux中使用fork()创建新进程的原理,明确了父进程与子进程的关系。

1.main函数是一个进程还是一个线程?

不知道你是用c创建的,还是用java创建的。
因为它们都是以main()做为入口开始运行的。 

是一个线程,同时还是一个进程。
在现在的操作系统中,都是多线程的。但是它执行的时候对外来说就是一个独立的进程。
这个进程中,可以包含多个线程,也可以只包含一个线程。

当用c写一段程序的话,就是在操作系统中起一个进程它包含一个线程。

而当用java等开发一个多线程的程序的话,它在操作系统中起了一个进程,但它可以包含多个同时运行的线程。

 

你起一个CS游戏,这上CS游戏在操作系统中就是一个进程。

但是这个游戏一边在打枪,一边人在走动,一边还有音乐 ,
打枪 , 走动 , 音乐 等都是一些线程。

线程不是由进程决定了。
这样会不会明白一点。

 

也就是说:你在操作系统中启动的任一个独运行的程序或者软件都是一个进程。
包括你在Linux中运行top时,它也是一个进程(当然很多人说成是线程),它有独立的进程ID,
可以用ps -ef| grep top的方式查看,并可以用kill 进程ID杀掉的。

但是这个进程包括几个线程,是由你的需求决定的,在写程序时由程序逻辑决定的;
而这些线程是包含在这个进程中的,而且这些线程他们共用CPU资源,在工作的过程
中需要不断的进行切换,轮换CPU时断,而各个线程在进行轮换时会共用进程的一些共享区域(或者交换空间)。其它的没有什么。

 

2.在Linux中编程,在main主函数中调用fork(),创建新进程。谁是父进程?是main函数所在的进程为父进程吗?谢谢!

是的. main()函数所在的进程是父进程, 用fork()创建的是子进程.

fork返回值大于0的是父进程,否则是子进程

 

http://www.360doc.com/content/08/1123/13/36491_1984855.shtml

 

http://www.cnblogs.com/skynet/archive/2010/10/30/1865267.html

 

 

 

 

 

??

转载于:https://www.cnblogs.com/Ph-one/p/4593770.html

### 在Linux下使用mmap函数为PCI设备分配内存以实现DMA数据传输 在Linux系统中,`mmap` 函数可以用于将文件或设备映射到进程的地址空间。对于PCI设备,`mmap` 可以用来将设备的内存区域映射到用户空间,从而允许用户程序直接访问设备内存。这种技术常用于实现高效的DMA数据传输。 #### mmap函数的基本用法 `mmap` 函数的原型如下: ```c void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); ``` - `addr`:建议的映射起始地址(通常设置为`NULL`,由内核决定)。 - `length`:映射区域的大小。 - `prot`:指定内存保护标志,如`PROT_READ`、`PROT_WRITE`。 - `flags`:指定映射选项,如`MAP_SHARED`或`MAP_PRIVATE`。 - `fd`:文件描述符,指向要映射的文件或设备。 - `offset`:文件中的偏移量,必须是页大小的整数倍。 对于PCI设备,`fd` 是通过打开设备文件(如`/dev/pci-device`)获得的文件描述符。 #### 实现步骤 1. **打开设备文件** 使用`open`函数打开PCI设备对应的设备文件,获取文件描述符。 ```c int fd = open("/dev/pci-device", O_RDWR); if (fd < 0) { perror("Failed to open device file"); return -1; } ``` 2. **调用mmap映射设备内存** 调用`mmap`函数将设备内存映射到用户空间。 ```c void *mapped_memory = mmap(NULL, LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (mapped_memory == MAP_FAILED) { perror("mmap failed"); close(fd); return -1; } ``` 3. **配置DMA传输参数** 根据引用内容[^1],需要设置DMA传输方向、内存地址和PCI设备地址等参数。这通常通过设备驱动程序提供的ioctl接口完成。 ```c struct dma_params params = { .direction = DMA_TO_DEVICE, .memory_addr = mapped_memory, .device_addr = DEVICE_ADDRESS, .size = LENGTH }; if (ioctl(fd, IOCTL_SET_DMA_PARAMS, &params) < 0) { perror("Failed to set DMA parameters"); munmap(mapped_memory, LENGTH); close(fd); return -1; } ``` 4. **启动DMA传输** 同样通过ioctl接口启动DMA传输。 ```c if (ioctl(fd, IOCTL_START_DMA) < 0) { perror("Failed to start DMA"); munmap(mapped_memory, LENGTH); close(fd); return -1; } ``` 5. **同步和释放资源** 在DMA传输完成后,确保与硬件同步,并释放映射的内存和文件描述符。 ```c munmap(mapped_memory, LENGTH); close(fd); ``` #### 注意事项 - 根据引用内容[^2],应避免直接使用`virt_to_bus`进行地址转换,而应使用通用DMA层来处理IOMMU相关的功能。 - 引用内容[^3]提到,DMA的实现高度依赖于具体的硬件架构。因此,在不同平台上可能需要调整代码以适配特定的硬件特性。 - 引用内容[^4]强调了初始化PCI设备的重要性,包括检查总线支持、读取配置头信息等。 - 引用内容[^5]指出,PCI设备的遍历和初始化是驱动开发中的关键部分,理解PCI体系结构对于正确实现DMA传输至关重要。 #### 示例代码 以下是一个完整的示例代码,展示如何使用`mmap`为PCI设备分配内存并实现DMA传输: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <errno.h> #define LENGTH 4096 #define DEVICE_ADDRESS 0x12345678 int main() { int fd = open("/dev/pci-device", O_RDWR); if (fd < 0) { perror("Failed to open device file"); return -1; } void *mapped_memory = mmap(NULL, LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (mapped_memory == MAP_FAILED) { perror("mmap failed"); close(fd); return -1; } // 假设ioctl接口已定义 struct dma_params { int direction; void *memory_addr; unsigned long device_addr; size_t size; }; struct dma_params params = { .direction = DMA_TO_DEVICE, .memory_addr = mapped_memory, .device_addr = DEVICE_ADDRESS, .size = LENGTH }; if (ioctl(fd, IOCTL_SET_DMA_PARAMS, &params) < 0) { perror("Failed to set DMA parameters"); munmap(mapped_memory, LENGTH); close(fd); return -1; } if (ioctl(fd, IOCTL_START_DMA) < 0) { perror("Failed to start DMA"); munmap(mapped_memory, LENGTH); close(fd); return -1; } munmap(mapped_memory, LENGTH); close(fd); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值