2016-07-03 88 views
-3

試過每種終止程序的方法,但它沒有奏效。嘗試了ASCII選項,其中120 = x並且還單獨嘗試了'x'來退出,但它似乎不起作用。此外還有非規範的方式。我不確定這是否是我編寫代碼的方式。我的程序沒有運行,我希望它運行。目的是讓子進程先顯示時鐘然後顯示鬧鐘,然後倒計時直到完成。 'x'將終止程序,或者當倒數完成並且鬧鈴響起時。按「x」將終止程序

$

void CMode (void){ 
    tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); 
    } 

//CanonicalMode and NonCanonicalMode 

void NMode (void) 
    { 
    struct termios tattr; 
    tcgetattr (STDIN_FILENO, &saved_attributes); 
    atexit (CMode); 

    tcgetattr (STDIN_FILENO, &tattr); 
    tattr.c_lflag &= ~(ICANON|ECHO); 
    tattr.c_cc[VMIN] = 1; 
    tattr.c_cc[VTIME] = 0; 
    tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); 
} 

void xfunc(char c) 
{ 
    while(TRUE) 
{ 
    read(STDIN_FILENO,&c,1); 
    if (c == 'x') 
    break; 
    else 
    putchar(c); 
} 
} 



    int main(int argc, char *argv[]) //argc: # of args passed, argv: vector array of each arg passed 
{ 
char userInput; 

if (pipe(fd) == -1) //create pipe & error check 
    exit(1); 


    if(argc==2) 
{ 
    ct = atoi(argv[1]); 
} 

else if(argc==4) 
{ 
    h = atoi(argv[1]); 
    m = atoi(argv[2]); 
    s = atoi(argv[3]); 
} 

else if(argc==5) 
{ 
    h = atoi(argv[1]); 
    m = atoi(argv[2]); 
    s = atoi(argv[3]); 
     ct = atoi(argv[4]); 
} 

if((child_one = fork()) == -1) 
{ 
    perror("fork failed"); 
    exit(1); 
} 
else if(child_one > 0) 
{ 
    fc_clock(); 
    exit(1); 
} 


if ((child_two = fork()) == -1) 
{ 
    perror("fork failed"); 
    exit(1); 
} 
else if(child_two > 0) 
{ 
    sc_alarm(1); 
    exit(1); 
} 


if ((child_three = fork()) == -1) 
{ 
    perror("fork failed"); 
    exit(1); 
} 
else if(child_three > 0) 
{ 
    tc_count(1); 
    exit(1); 
} 

NMode(); 
xfunc(userInput); 
return 0; 
} 
+2

你可以給你多一點信息,你正在試圖做什麼?比如,你在等待用戶按「x」的位置? –

+0

這聽起來不像一個問題,但更像是寫我的代碼請求。你應該首先閱讀如何問問指南[這裏](http://stackoverflow.com/help/how-to-ask)。請只發布代碼的相關部分,並且@Shiva已經說過,告訴我們你想做什麼以及你已經嘗試過什麼。另外,爲什麼它不起作用?你不能讀取一個字符(你的案例中是'x')還是你無法檢測到它是'x'? – mame98

+0

@Shiva用戶按下x的地方並不重要。但只要按下「x」,程序就完全終止 –

回答

0

叉致力於爲看 'x' 的一個新的子流程:

所以,你會做這樣的事情:

int pid; // this is the parent 
if((pid = fork()) != -1) 
{ 
    while(getchar() != 'x'); 
    signal(getppid(), SIGINT); 
} 

確保這個孩子過程是你父母的直接孩子。現在,在你的父母身上,建立一個信號處理程序,在接收到SIGINT時執行。在信號處理程序中,終止所有其他子進程(您不希望孤兒,因爲他們會繼續運行,因爲善良知道多久)。最後,您在父母上撥打exit(0)