关于父子进程之间的问题! 2011年10月27日11:36:01

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

<未完>

写给自己,请勿评论!

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值