2010-06-04 34 views
4

我想在Linux上使用(Unix 98風格)僞tty接收(並稍後處理)write(1)wall(1)消息。 我已經有以下最小實現:從pty讀取

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <signal.h> 
#include <utempter.h> 

#define BUF_LENGTH 1024 

int 
main (void) 
{ 
    FILE *lf; 
    int masterfd, slavefd; 
    char *slave_name = NULL; 
    char buf[BUF_LENGTH]; 
    size_t nbytes = sizeof(buf); 
    ssize_t bytes_read; 
    int exit_code = EXIT_SUCESS; 

    if ((masterfd = posix_openpt (O_RDWR | O_NOCTTY)) == -1 
      || grantpt (masterfd) == -1 
      || unlockpt (masterfd) == -1 
      || (slave_name = ptsname (masterfd)) == NULL) 
     exit (EXIT_FAILURE); 

    if (!(lf = fopen("term.log","w"))) 
     exit (EXIT_FAILURE); 

    addToUtmp (slave_name, NULL, masterfd); 

    for (;;) 
    { 
     bytes_read = read(masterfd, buf, nbytes); 
     if (bytes_read <= 0) 
      break 
     fwrite (buf, 1, bytes_read, lf); 
    } 

    if (bytes_read < 0) 
    { 
     fprintf (stderr, "error reading from master pty: %s\n", strerror (errno)); 
     exit_code = EXIT_FAILURE; 
    } 

    fclose (lf); 
    if (slavefd >= 0) 
     close (slavefd); 
    if (masterfd >= 0) 
    { 
     removeLineFromUtmp (slave_name, masterfd); 
     close (masterfd); 
    } 
    exit (exit_code); 
} 

的問題是,現在它僅適用於讀的第一條消息,然後讀給我一個EIO錯誤。這是爲什麼?

回答

1

它看起來像是在最後一個從屬文件描述符關閉時發生的。考慮到write(1)wall(1)將具有唯一的從屬文件描述符,只要這些文件完成寫入即可獲得EIO。

防止這種情況發生的最簡單方法是保持文件描述符。在您撥打ptsname後立即撥打open(slave_name, O_RDRW)

(奇怪的是,你已經有了一個slavefd變量,並把它清理乾淨的代碼,你是考驗我們:?P)

+0

D'哦,我一定是不小心刪除了開行試驗時(如您注意到fd變量和清理已經在那裏)。非常感謝,另一雙眼睛有時可以非常有幫助:) – gber 2010-06-04 16:54:55