求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (tty

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu

求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (tty

#1

帖子 zero_hsy » 2013-03-17 10:04

运行的时候,报这个错:Program received signal SIGTTIN, Stopped (tty input).,求帮助,这是怎么回事???
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (

#2

帖子 YeLee » 2013-03-17 10:07

这不是后台么?直接kill -CONT PID啊。 :em20 :em20 :em20
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu

Re: 求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (

#3

帖子 zero_hsy » 2013-03-17 10:19

为什么会产生这样的结果啊?求解释!!!! :em20
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (

#4

帖子 YeLee » 2013-03-17 10:24

你不告诉我我怎么知道? :em01 :em01 :em01
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu

Re: 求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (

#5

帖子 zero_hsy » 2013-03-17 17:44

是不是贴代码啊

代码: 全选

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
//#define prompt "<<<<"
#define bufsize 50
#define size 50
char buffer[2048];
int version = 1;
char buf[bufsize];
char commandName[50];
char arg1[50];
char arg2[50];
char ptr[50];
//void parse(char *prompt,File *fp);
//void exec(char *commandName,char *arg1,char *arg2);
//void parse2(char *prompt,File *fp);
//void parr(char *prompt,File *fp);
void parse(FILE *fp);
void chaifen();
void exec(char *commandName,char *arg1,char *arg2);
void copy();
void copyOperation (int old,int new);
int main(){
       int i;
        for (i=0;i<50;i++)
   {
    commandName[i]='\0';
    arg1[i]='\0';
    arg2[i]='\0';
    ptr[i]='\0';
    }
	while( 1)
	{
	    int i;
            if (getcwd(ptr,size)==NULL)
               printf("getcwd failed!\n");
            else
               printf("%s",ptr);
	    //输出“$”提示符,等待用户输入命令行;
	    printf("#   ");
	    parse(stdin);// 命令行; //命令行字符串分析:目标得出待运行程
		               //序的文件名 commandName,arg1,arg2
	    if (strcmp(buf,"logout\n")==0)
            {
           //     printf("logout2222");
		break;}
		
            else 
               chaifen();

	    //if(命令行==logout)
	    //    exit( );

	    //if((i=fork( )) ==0 )
	    if ((i=fork())==0)
		exec(commandName,arg1,arg2);
	    else
		sleep(22);
	}
    return 0;
}


//void parse(char *prompt,File *fp)
void parse(FILE *fp)//char *prompt,
{

   int i,j;
  	fflush(stdin);
   fgets(buf, bufsize, stdin);
   printf("buf= %s",buf);
   //fputs(buf,stdout);//fputs(fgets(s,80,stdin),stdout);   检验是不是把buf的内容输出
   

}

void chaifen()
{
   
   int i,j; 
  // for (i=0;i<50;i++)
   //{
    //commandName[i]='\0';
    //arg1[i]='\0';
    //arg2[i]='\0';
    //}
   //fflush(stdin);
   for (i=0;(buf[i]!=' ')&&(buf[i]!='\n');i++)
   {
     // printf("11111111\n");
      commandName[i]=buf[i];
     // flag=1;
   }
   // printf("2222\n");
   
   commandName[i]='\0';
  // printf("   CommandName=%s\n",commandName);
   j=0;
   for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
   {
      arg1[j]=buf[i];
      j++;
   }
   arg1[j]='\0';
  // printf("   arg1=%s\n",arg1);
   j=0;
   for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
   {
      arg2[j]=buf[i];
      j++;
   }
   arg2[j]='\0';
   //printf("   arg2=%s\n",arg2);

}


void exec(char * commandName,char *arg1,char *arg2 )
{
   if (  (strcmp(commandName,"copy")==0) &&(strcmp(arg1,"file1")==0)&&(strcmp(arg2,"file2")==0)  )
      copy();
  else
     printf("PID=%d!\n ",getpid());
}

void copy()
{
   int i = 0;
   int fdold,fdnew;
   fdold = open("file1", O_RDONLY);
   if(fdold == -1)
   {
     printf("can not open file %s\n","file1");
     exit(1);
   }
   fdnew = creat("file2", 0666);
   copyOperation (fdold, fdnew);
   printf ("This is process %d\n", getpid() );
   printf("Copy Done!From %s To %s\n", "file1","file2");
   exit(0);

}



void copyOperation (int old,int new)

{
	int count;

	while ((count=read(old,buffer,sizeof(buffer)))>0)
		write(new, buffer, count);
    return;
}
当输入:cd d f
之后就会报这个错
[img]/home/huang/图片/2013-03-17%2010:09:28的屏幕截图.png[/img]
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (

#6

帖子 YeLee » 2013-03-17 22:42

建议楼主还是自己调试一下,看问题出在哪里吧。 :em20 :em20 :em20
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 求帮助,运行的时候报这个错:Program received signal SIGTTIN, Stopped (

#7

帖子 YeLee » 2013-03-18 9:05

好吧,昨晚回来晚了点,而且由于太过匆忙,代码未来得及看。趁着今天早上还有点时间,看了一眼,顺便加了点注释。 :em01 :em01 :em01
[c]
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#define bufsize 50
#define size 50
char buffer[2048];
//int version = 1;
char buf[bufsize];
char commandName[50];
char arg1[50];
char arg2[50];
char ptr[50];

void parse(FILE *fp) //char *prompt,
{

//既然都有参数过来了,那就用嘛
fflush(fp);
//建议使用前还是置零一下buf
memset(buf , 0 , sizeof(buf));
fgets(buf, bufsize, fp);
printf("buf= %s", buf);

}

void chaifen()
{

int i, j;

//一些变量在使用前还是处理一下
memset(commandName , 0 , sizeof(commandName));
memset(arg1 , 0 , sizeof(arg1));
memset(arg2 , 0 , sizeof(arg2));

for(i = 0; (buf != ' ') && (buf != '\n'); i++) {
commandName = buf;
}

//传入参数未经检查就乱赋值,不是一个好习惯,容易出现段错误
//虽然scanf可以格式化输入,只是没有数组越界检查不是很推荐
//假如用户的输入是双引号和单引号这些又如何拆分呢
//与其渴望用户遵循输入规则,不如程序员自己检查用户输入
commandName = '\0';
j = 0;

for(i = i + 1; (buf != ' ') && (buf != '\n'); i++) {
arg1[j] = buf;
j++;
}

arg1[j] = '\0';
j = 0;

for(i = i + 1; (buf != ' ') && (buf != '\n'); i++) {
arg2[j] = buf[i];
j++;
}

arg2[j] = '\0';

}

void copyOperation(int old, int new)
{
int count;

while((count = read(old, buffer, sizeof(buffer))) > 0)
write(new, buffer, count);

return;
}

void copy()
{
int fdold, fdnew;
fdold = open("file1", O_RDONLY);

if(fdold == -1) {
printf("can not open file %s\n", "file1");
exit(1);
}

fdnew = creat("file2", 0666);
copyOperation(fdold, fdnew);
printf("This is process %d\n", getpid());
printf("Copy Done!From %s To %s\n", "file1", "file2");
exit(0);

}

void exec(char * commandName, char *arg1, char *arg2)
{
if((strcmp(commandName, "copy") == 0) && \
(strcmp(arg1, "file1") == 0) && (strcmp(arg2, "file2") == 0))
copy();
else
printf("PID=%d!\n", getpid());
}

int main()
{

// int i;
// for (i=0;i<50;i++)
// {
// commandName[i]='\0';
// arg1[i]='\0';
// arg2[i]='\0';
// ptr[i]='\0';
// }

//所以说memset可以减轻负担
memset(commandName , 0 , sizeof(commandName));

while(1) {
int i;

if(getcwd(ptr, size) == NULL)
printf("getcwd failed!\n");
else
printf("\e[32m%s\e[0m", ptr);

//输出“$”提示符,等待用户输入命令行;
printf("\e[31m#\e[0m");
parse(stdin);

if(strcmp(buf, "logout\n") == 0) {
break;
} else
chaifen();

if((i = fork()) == 0)
exec(commandName, arg1, arg2);
else
sleep(22);
}

return 0;
}


[/c]
为了方便阅读,代码的顺序调整了一下,还望楼主恕罪。
另,刚才调试了一下代码,表示仍旧没有出现楼主说到的情况,这点还望楼主能再调试一下,尽量重现之前的问题,毕竟没有重现可能性的bug算不上一个好bug。
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
回复