- 论坛徽章:
- 0
|
- /* 这个是linux下最简单的多进程代码了,相当与简单的命令执行终端,fork产生新的进程,exevcp为新进程产生映像,makeargs函数为exevcp函数提供参数,不知为何makeargs函数提供的参数exevcp函数总不能执行,请各位大侠帮忙看看哈
- */
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<string.h>
- #include<errno.h>
- #include<sys/wait.h>
- #include<sys/types.h>
- #define MAX_PR 10
- #define MAX_ARG 100
- #define DEBUG
- void makeargs(char *buf,char ***args) //为exevcp函数提供参数,就是把buf里的字符串分别提取出来
- {
- int i,j=0;
- int flag=0;
- *args=(char **)malloc(sizeof(char *)*10);
- if(!args)
- perror("args memory malloc error");
- for(i=0;i<10;i++)
- {
- (*args)[i]=(char *)malloc(sizeof(char)*100);
- if(!(*args)[i])
- perror("args [] memory malloc error");
- }
- for(i=0;buf[i]!='\0';)
- {
- for(;buf[i]==' '||buf[i]=='\t';i++)
- {
- ;
- }
- int start=i;
- for(;buf[i]!=' '&&buf[i]!='\t'&&buf[i]!='\0';i++)
- {
- flag=1;
- }
- if(flag==1)
- {
- int k,l=0;
- for(k=start;k<i;k++)
- {
- (*args)[j][l]=buf[k];
- l++;
- }
- (*args)[j][l]='\0';
- j++;
- }
- flag=0;
- }
- (*args)[j]=NULL;
- }
- int main(int argc,char **argv)
- {
- int pr_count=0,pr_limit=MAX_PR;
- char buf[MAX_ARG],**args;
- int i,child[MAX_PR];
- pid_t myoldid,myid,childid;
- myid=getpid();
- myoldid=myid;
- while(myid==myoldid) //为了防止子进程也运行此循环而设立的条件
- {
- fprintf(stdout,"--->");
- fflush(stdin);
- fgets(buf,MAX_ARG,stdin);
- makeargs(buf,&args);
- #ifdef DEBUG
- fprintf(stdout,"input is :");
- for(i=0;args[i]!=NULL;i++)
- fprintf(stdout,"%s ",args[i]);
- #endif
- if(strcmp(args[0],"exit")==0)
- {
- return 0;
- }
- if(pr_count==pr_limit)
- {
- fprintf(stdout,"please wait...\n");
- for(i=0;i<pr_count;i++)
- {
- childid=waitpid(child[i],NULL,WNOHANG);
- if(childid==0)
- pr_count--;
- }
- }
- childid=fork();
- child[pr_count]=childid;
- if(childid==-1)
- perror("failed to fork");
- else
- {
- myid=getpid();
- execvp(args[0],args); //为新进程产生映像
- pr_count++;
- }
- }
- return 0;
- }
复制代码 |
|