伪终端的分段故障

时间:2014-09-01 14:57:04

标签: c linux segmentation-fault pty

我在fprintf上遇到了这段代码的分段错误:

#define _GNU_SOURCE

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

int fd;
int main(int argc, char **argv) {
    fd = posix_openpt(O_RDWR | O_NOCTTY);

    fprintf(fd, "hello\n");

    close(fd);
}

但它适用于:

fprintf(stderr, "hello\n");

造成这种情况的原因是什么?

3 个答案:

答案 0 :(得分:10)

您有段错误,因为fdintfprintf除了FILE*

fd = posix_openpt(O_RDWR | O_NOCTTY);
fprintf(fd, "hello\n");    
close(fd);

尝试fdopen而不是fd

FILE* file = fdopen(fd, "r+");
if (NULL != file) {
  fprintf(file, "hello\n");    
}
close(fd);

答案 1 :(得分:5)

您正尝试将文件描述符(用于低级文件访问)传递给fprintf,但它实际上需要FILE结构,在stdio.h中定义。

您可以使用dprintffdopen(POSIX)。

答案 2 :(得分:3)

要写出文件描述符,请使用write()fprintf命令需要FILE*类型指针。

#define _XOPEN_SOURCE 600

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

int main(void)
{
  int result = EXIT_SUCCESS;
  int fd = posix_openpt(O_RDWR | O_NOCTTY);
  if (-1 == fd)
  {
    perror("posix_openpt() failed");
    result = EXIT_FAILURE;
  }
  else
  {
    char s[] = "hello\n";
    write(fd, s, strlen(s));

    close(fd);
  }

  return result;
}