2013-03-03 47 views

回答

2

當我編譯execl(...),它打印出的按Ctrl-d就好

#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    execl("/bin/bash", "/bin/bash", 0); 
    return 0; 
} 

也許,你做一個fork()或從終端分離或做別的事情,這讓慶典假設它是不-互動。

Ctrl-D通常由終端解釋。如果您想自己執行此操作,則必須在termios結構中重置VEOF,詳情請參閱c_cc

這是一個簡單的例子,您可以自己處理Ctrl-D。它仍然讀取處理任何事情之前一整行,但你的想法

#include <sys/wait.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <termios.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    char buf[100]; 
    int fd; 
    struct termios tio; 
    fd = open("/dev/tty", O_RDWR); 
    if (fd < 0) { 
     perror("open tty"); 
     exit(1); 
    } 

    memset(&tio, 0, sizeof(tio)); 
    tcgetattr(fd, &tio); 
    tio.c_cc[VEOF] = 0; 
    tcflush(fd, TCIFLUSH); 
    tcsetattr(fd, TCSANOW, &tio); 

    while (fgets(buf, sizeof(buf), stdin)) { 
     if (buf[0] == 4) { 
      printf("Got Ctrl-D\n"); 
      break; 
     } 
    } 

    return 0; 
} 

這個程序讀取來自終端的線,直到它接收到開始Ctrl-D線。

更多示例請參閱Serial Programming HOWTO

+0

的確,我正在做一個分叉。並使用短語來撤銷ECHO。我想以某種方式捕捉Ctrl + D。我在兒子身上做了一個'exelc',我在父親那裏讀了它。我怎樣才能以這種方式捕捉Ctrl + D? – Elfayer 2013-03-03 21:38:54

+0

@Elfayer請參閱最新的答案。 – 2013-03-03 22:04:39

+0

我已經試過類似於't.c_cc [VEOF] =「exit」;',但它需要一個字符。 – Elfayer 2013-03-03 22:16:23