多进程开发

多进程开发,第1张

进程开发

每一个CPU上,可以存在多个进程,但在同一时间内,CPU内只能有一个进程工作。Linux系统至少有一个进程,一个程序可以对应多个进程,一个进程对应一个程序。

char *getenv(const char *name);name是要获取的环境变量,函数返回值为Null,表示没有获取到指定环境变量的值,否则指向获取到的环境变量值的字符串。

 

创建进程、等待进程结束、

pid_t fork(void);创建进程

pid_t waitpid(pid_t pid,int *status,int options);//

options取值
WHOHANG 如果没有子进程退出,立即返回
WUNTRACED 如果有处于停止状态的进程将导致调用返回
WConTINUED 如果停止了的进程由于SIGCONT信号的到来而继续运行,调用将返回
0 

 fork()函数后,创建一个新的进程,也就是子进程。对于子进行fork()函数的返回值是0,对于父进程,fork()函数返回的是子进程的进程。fork()函数创建子进程后,会复制父进程的数据段、代码段和堆栈空间等。

退出进程

exit()、_exit), atexit()和on-exit()。exit()函数的作用是退出当前进程,并且尽可能释放当前进程占用的资源。_exit)函数的作用也是退出当前进程,但是并不试图释放进程占用的资源。atexit()函数的和on_exit()函数的作用都·是为程序退出时指定调用用户的代码,区别在于on_exit()函数可以为设定的用户函数设定参数。

头文件是

int atexit(void(*function)(void));

int on_exit(void(*function)(int,void *),void *arg);

头文件是

void exit(int status);

 常用进程通信的方法

 Linux提供了多种进程间通信的方法,常见的包括管道、FIFO、消息队列、信号量、共享内存,以及通过socket也可以实现不同进程间的通信。

创建管道

头文件是unistd.h int pipe(int filedes[2]);成功返回0失败返回-1,filedes[0]读端,filedes[1]写端。

管道要求是:一个管道只能在一个方向上传送数据,另一个管道只能在有共同父进程的进程间使用。通常管道通信流程为:由一个进程创建,之后进程调用fork()函数创建新的进程,父进程和子进程之间可以使用管道通信。

 共享内存

 共享内存是在内存中开辟一段空间,供不同的进程访问。与管道相比,共享内存不仅能在多个不同进程(非父子进程)间共享数据,而且可以比管道传送更大量的数据。

共享内存在使用之前需要先创建,之后获得共享内存的入口地址就可以对共享内存 *** 作了。不需要使用共享内存的时候,还可以在程序中分离共享内存。

 头文件为

int shmget (key t key, size t size, int shmflg);
void *shmat (int shmid, const void*shmaddr, int shmflg);
int shmdt (const void *shmaddr); 
shmget()函数用来创建共享内存,参数key是由ftok)函数生成的一个系统唯一的关键字,用来在系统中标识一块内存, size参数制定需要的共享内存字节数, shmflg参数是内存的 *** 作方式,有读或者写两种。如果成功创建共享内存,函数会返回一个共享内存的ID.

shmat()函数是获得一个共享内存ID对应的内存起始地址;参数shmid是共享内存ID,shmaddr参数指定了共享内存的地址,如果参数值为0,表示需要让系统决定共享内存地址,如果获取内存地址成功,则函数返回对应的共享内存地址。

shmdt()函数从程序中分离一块共享内存。参数shmaddr标识了要分离的共享内存地址。 

写内存例子 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5704020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存