#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); 以后自己要注意,一定要让子进程退出!子进程没有退出时,又会循环,很是不好搞!
<未完>
写给自己,请勿评论!