Linux 多进程学习
1Linux进程概述
1.1进程标识
1.2进程的用户ID与组ID
进程运行过程中必须有类似于用户的身份,哪个用户就是该用户的身份,就是那个用户的组 可用getuid(),getgid();获得 进程还有有效用户ID和有效组ID,缺少的情况下,与真实ID相同,可以用geteuid(),getegid(); 文件权限有S的时候,有效ID是进程的所有者(创建者),否则有效ID就是程序的运行者,与真实ID相同
ps -aux查看所有用户进程的权限,cpu,和内存的使用情况
1.3进程的状态
1.4LInux下的进程结构
1.5LInux下的进程管理
2 进程的创建
2.1system函数
#include<iostream> #include<stdlib.h> #include<string.h> #include<stdio.h> using namespace std; int main(int argc,char *argv[]){ char cmd[1024]=""; for(int i=1;i<argc;i++){ strcat(cmd,argv[i]); strcat(cmd," "); } puts(cmd); int ans; ans=system(cmd); printf("%x\n",ans); }用system调用其他可执行程序,并输入参数 输入例如: ./main ./my_add 其中my_add计算两个数之和
int main(int argc,char *argv[]){ if(argc!=2){ printf("failed\n"); return 0; } int left,right; char cmd[1024]=""; char line[1024]=""; strcat(cmd,argv[1]); strcat(cmd," "); while(printf(">>"),scanf("%d %d",&left,&right)){ memset(line,0,sizeof(line)); sprintf(line,"%s %d %d",argv[1],left,right); strcpy(cmd,line); int ret; ret=system(cmd); printf("result:%d\n",ret/256); } }
2.2fork函数
#include<iostream> #include<unistd.h> #include<stdlib.h> #include<stdio.h> using namespace std; int main(int argc,char *argv[]){ pid_t pid; int i=3; printf("hello\n"); pid=fork(); fflush(stdout);//儿子复制的时候将缓冲区也复制了,如果没有这句话,上面的hello将出现两便 if(pid>0){ printf("parents:pid:%u,ret:%u,pp:%u\n",getpid(),pid,getppid()); } else if(pid==0){ // sleep(5); printf("child:pid:%u,ret:%u,pp:%u\n",getpid(),pid,getppid()); } printf("bye!\n"); }
2.3exec函数
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
if(execl("/home/yang/0820/my_exec/","my_add","3","2",NULL)==-1){ perror("execl error"); }int execlp(const char *file, const char *arg, ...);例如:
if(execlp("./my_add","my_add","fwef","fwe","fewgeraf",NULL)==-1){ perror("execlp error"); }int execv(const char *path, char *const argv[]);例如:
char *args[10]; args[0]="my_add"; args[1]="12"; args[2]="23"; args[3]=NULL; if(execv("/home/yang/0820/my_exec/my_add",args)==-1){ perror("execl:"); }
2.4popen函数(以后补充)
popen函数类似system函数,与system不同之处在于它使用管道操作,FILE*popen(const char *command, const char *type);
int pclose(FILE *stream);
command为可执行文件的全路径和执行参数,type可选参数为“r” 或“w”FILE *fp; char a[1000]; char b[1000]; char cmd[1024]=""; printf("plseas write\n"); fgets(a,1000,stdin); sprintf(cmd,"%s %s",argv[1],a); fp=popen(cmd,"r");//这个指令cmd为可执行文件的全路经 fgets(b,1000,fp); printf("%s\n",b);
新进程屏幕输出:
FILE *fp; char a[1000]; gets(a); fp=popen(argv[1],"w"); fputs(a,fp); pclose(fp);
3.进程控制与终止
#include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { pid_t pid = fork(); if( pid == 0 ) { exit(10); } else { sleep(10); } }避免僵尸进程例子:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { pid_t pid = fork(); if( pid == 0 ) { exit(10); } else { wait(NULL); //NULL表示等待所有进程 sleep(10); //通常要将sleep放在wait的后面,要不然也会出现僵尸进程 } }
3.2进程的终止
exit和_exit函数的原型:
#include<stdlib.h> //exit的头文件
#include<unistd.h> //_exit的头文件
void exit(int status);
void_exit(int status);
status是一个整型的参数,可以利用这个参数传递进程结束是的状态,0表示正常退出,其他数表示出现错误,进程非正常结束郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。