关于父子进程之间的问题! 2011年10月27日11:36:01
2011-10-27 11:32
363 查看
#include<string.h> #include<stdlib.h> #include<stdio.h> int makeargv(char *s,char *delimits,char ***argvp) { char *t; char *snew; int numtokens; int i; char stop[100]; snew = s + strspn(s,delimits); // strspn 用来测试字符串s中,寻找到多少delimits #if 0 printf("\ninput!\n"); printf("s = %p\n,strspn = %d\n,snew = %p\n",s,strspn(s,delimits),snew); scanf("%s",stop); printf("stop = %s",stop); printf("\ngo on!!!\n"); #endif if( ( t= calloc(strlen(snew)+1,sizeof(char)) )==NULL) //calloc 用来在内存中申请一个数组的空间 { printf("\ngo error in!!!\n"); *argvp = NULL; numtokens = -1; } else { printf("\ngo in!!!\n"); strcpy(t,snew); //字符串copy!! if(strtok(t,delimits)==NULL) //strtok ?? { numtokens = 0; } else { for(numtokens = 1;strtok(NULL,delimits)!=NULL;numtokens++); } if((*argvp = calloc(numtokens +1,sizeof(char *)))==NULL) // calloc { free(t); numtokens = -1; } else { if(numtokens>0) { strcpy(t,snew); **argvp = strtok(t,delimits); for(i = 1; i<numtokens+1;i++) *((*argvp)+1) = strtok(NULL,delimits); } else { **argvp = NULL; free(t); } } } return numtokens; } int main(void) { char cmdline[256]; char **argv; int pid; printf("input the command,input \"quit\",if you want to quit\n"); printf(">"); for(;;) { printf("\nstart loop!\n"); scanf("%s",cmdline); printf("cmdline: %s !\n",cmdline); if(strcmp(cmdline,"tt")==0) break; else { if(strcmp(cmdline,"===")==0) printf("\n===============================================\n"); //printf(">"); pid =fork(); if(pid == 0) { printf("\ngo in childps!\n"); if(makeargv(cmdline," ",&argv)>0) printf("\nend makeargv !\n"); execvp(argv[0],argv); printf("\ngo out childps!\n"); exit(1); } else if (pid >0) { sleep(1); printf("\ngo in fatherps!\n"); wait(NULL); printf("cmdline is: %s !\n",cmdline); memset(cmdline,0,sizeof(cmdline)); printf("cmdline is: %s !\n",cmdline); printf("end!\n",cmdline); } } } exit(0); }
就是这个程序,让我花了不少的时间,主要的问题总结:
1、 对于scanf 这样的函数使用要注意,例如scanf(“%s”,cmdline);这时如果我输入两个字符串时,程序就会按照先后,执行两边这一点注意!
2、 fork函数中,如上程序当子进程运行时 开始execvp(argv[0],argv); 如果此时给如的参数不合规定,这是程序就会阻塞, 连父进程也退出出来,所以我在后面加了一句!
exit(1); 以后自己要注意,一定要让子进程退出!子进程没有退出时,又会循环,很是不好搞!
<未完>
写给自己,请勿评论!
相关文章推荐
- 关于fork()函数父子进程之间的问题
- 关于父子进程之间的数据共享
- 问题:子进程父进程哪个先执行:【转】关于 fork 和父子进程的理解
- 关于fork()父子进程返回值的问题
- 问题:子进程父进程哪个先执行:【转】关于 fork 和父子进程的理解 + 【转】
- linux系统下 fork()系统调用: 关于父子进程缓存问题的小坑
- C/C++ 父子进程之间的文件描述符问题
- 关于病毒模块插入系统、应用程序进程的问题
- 关于kafka退出进程的问题
- 关于mscorsvw.exe进程的问题
- 关于微软有自增列父子表更新程序的问题
- 匿名管道实现父子进程之间的通信....
- 关于Java中byte,short,char,int 之间相互赋值的问题
- 关于在两个jsp页面之间传递值的问题
- 一个关于linux进程函数kill的问题
- 关于ListView中多个EditText之间相互联动导致无限循环问题的解决方法
- 应用管道实现父子进程之间的通信
- 关于加@Transactional注解的方法之间调用,事务是否生效的问题
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- 关于iOS 11 tableView跟导航栏之间有空白和tableview的头视图问题