您的位置:首页 > 其它

关于父子进程之间的问题! 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); 以后自己要注意,一定要让子进程退出!子进程没有退出时,又会循环,很是不好搞!

<未完>

写给自己,请勿评论!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null input command 测试