1 进程结构
1.1 代码段:存放代码数据。
1.2 堆栈段:函数返回值、参数,局部变量。
1.3 数据段:全局变量、常数、动态分配的数据空间。
2 创建进程
2.1 system系统调用函数,如:system("ls -a")。
2.2 fork和exec函数
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc, char **argv)
{
pid_t child_id;
if(( child_id = fork()) != 0) {
//父进程
} else {
//子进程
}
return 0;
}
一旦运行exec函数,进程本身就销毁了(代码段替换成新程序代码,废弃原来的堆栈段和数据段,分配新的),只保留进程号。
3 进程间通信
管道、消息队列、共享内存、信号量和套接字等
3.1 管道:匿名管道和有名管道
void main()
{
pid_t child_id;
int file_dis[2];
int recv_count;
char buf[256];
//创建匿名管道,file_dis[0]为读端,file_dis[1]为写端。
pipe(file_dis[2]);
//创建进程
if((child_id = fork()) != 0){
//父进程写数据,关闭读端。
close(file_dis[0]);
write(file_dis[1], "Hello world", strlen("Hello world"));
exit(0);
} else {
//子进程读数据,关闭写端
close(file_dis[1]);
recv_count = read(file_dis[0], buf, sizeof(buf));
}
}
3.2 共享内存
进程间通信最快的方式。
#include<stdio.h>
#include<sys/shm.h>
#include<sys/stat.h>
int main()
{
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;
//分配共享内存段
segment_id = shmget(IPC_PRIVATE, shared_segment_size, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
//将共享内存粘贴到进程地址空间
shared_memory = (char*)shmat(segment_id, 0, 0);
//测试共享内存大小
shmctl(segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
//向共享内存中写入数据
sprintf(shared_memory, “Hello, world.”);
//从进程地址空间中移除共享内存段
shmdt(shared_memory);
//将共享内存段粘贴到另一地址空间
shared_memory = (char*)shmat(segment_id, (void*)0x5000000, 0);
//输出共享内存中的数据
printf(“%s\n”, shared_memory);
//移除共享内存段
shmdt(shared_memory);
//将共享内存段归还给系统
shmctl(segment_id, IPC_RMID, 0);
return 0;
}