【问题标题】:Unable use write() to write to standard out无法使用 write() 写入标准输出
【发布时间】:2018-05-22 23:20:10
【问题描述】:

我正在尝试使用 write() 一次将一个字符写入标准输出一个字节。该程序编译并运行良好,但输出结果并不完全正确。现在我正试图让它通过 write 运行,但在控制台中没有得到任何输出。

void myfunction(char *s, int fd, int n){

    for(int i = 0; i != sizeof(s) - 1; ++i){
        fprintf(stderr, "%s\n", &s[i]);  // This correctly prints out the string

        if( write(fd, &s, 1) < 0){ // This will not print to the console
             perror("Error: Write problems.");  // Have not gotten any errors yet   
        }

        wastesometime(n);  // This just calls a for loop that runs n times
    }
}


sizeN = sprintf(buffer, "This is process %d with ID %ld and parent id %ld\n", i, (long)getpid(), (long)getppid());

myfunction(buffer, STDOUT_FILENO, n);

目前我正在从 fprintf 获得这种形式的输出:

process 2 with ID 27711 and parent id 27710
rocess 2 with ID 27711 and parent id 27710
ocess 2 with ID 27711 and parent id 27710
cess 2 with ID 27711 and parent id 27710
ess 2 with ID 27711 and parent id 27710
ss 2 with ID 27711 and parent id 27710
s 2 with ID 27711 and parent id 27710
 2 with ID 27711 and parent id 27710
2 with ID 27711 and parent id 27710
 with ID 27711 and parent id 27710
with ID 27711 and parent id 27710
ith ID 27711 and parent id 27710
th ID 27711 and parent id 27710
h ID 27711 and parent id 27710
 ID 27711 and parent id 27710
ID 27711 and parent id 27710
D 27711 and parent id 27710
 27711 and parent id 27710
27711 and parent id 27710
7711 and parent id 27710
711 and parent id 27710
11 and parent id 27710
1 and parent id 27710
 and parent id 27710
and parent id 27710
nd parent id 27710
d parent id 27710
 parent id 27710
parent id 27710
arent id 27710
rent id 27710
ent id 27710
nt id 27710
t id 27710
 id 27710
id 27710
d 27710
 27710
27710
7710
710
10
0

但我正在尝试使用 write 而不是 fprintf 为每个进程获取此输出:

This is process 2 with ID 27711 and parent id 27710   

这可能是相关的,但 fprintf(stderr, %d\n", &amp;s[i]) 有效且 fprintf(stdout, %d\n", &amp;s[i])?我相信stderr 获得优先权,但我不认为其他输出根本不会被打印?

是的,我进行了一些研究,但我发现的大多数答案都使用 fwrite() 或使用 C++,因此不是我想要的。

【问题讨论】:

  • s 是如何定义的?什么是不正确的输出,您期望什么?
  • 确定没有发送到stdout吗?甚至不是非打印字符?
  • STDOUT_FILENO 定义为什么?
  • 看起来s 是一个字符串(字符数组),&amp;s 应该是&amp;s[i]
  • sizeof(s) 应该是strlen(s)

标签: c unix posix


【解决方案1】:

缺少一些细节,但根据您目前发布的内容,这应该可行:

void myfunction(char *s, int fd, int n) {

    if( write(fd, s, strlen(s)) < 0) {
         perror("Error: Write problems.");
    }

    wastesometime(n);
}

让我们确保我们了解这里发生了什么。在myfunction 中,参数s 是一个指向char 的指针,更具体地说,它指向一个以null 结尾的字符数组的第一个字符,这是C 对字符串的定义。

您尝试使用的write 函数也接受指向char 的指针。但是,它并不坚持(或期望)该指针专门指向一个以空字符结尾的字符串。它可以是指向任何字符数组的指针。由于write 不假定以空字符结尾的字符串,因此您必须准确告诉它您希望它写入多少个字符。

由于您从一个以 null 结尾的字符串开始,您可以通过调用标准 @ 来计算字符串中的实际字符数(这正是您需要作为第三个参数传递给 write 的数字) 987654329@ 函数,如我所示。

您的问题可能与未正确定义 STDOUT_FILENO 有关。请尝试所有这四个调用:

myfunction(buffer, 1, n);

myfunction(buffer, 2, n);

myfunction(buffer, fileno(stdout), n);

printf("STDOUT_FILENO = %d\n", STDOUT_FILENO);

【讨论】:

  • 我怀疑这是问题所在。 STDOUT_FILENO 在 unistd.h 中定义,除非您取消并重新定义它,否则它将是正确的。
  • @R.. 我也对此表示怀疑,但 OP 声称 write(STDOUT_FILENO, s, strlen(s)) 不起作用,所以我正在探索选项......
  • 我尝试使用 1 & 2 代替 STDOUT/STDIN,但都没有产生任何输出。我还尝试了您的其他建议,但仍然没有输出。我不知道我的问题是否清楚,但似乎只有带有 fprintf 的 stderr 可以打印到控制台。
【解决方案2】:
void myfunction(char *s, int fd, int n)
{
    for (int i = 0; i < strlen(s); i++)
    {
        if (write(fd, s + i, 1) < 0)
        {
             perror("Error: Write problems.");
        }
        sleep(n);
    }
}

你不需要发送 &s 来写,因为 s 已经是一个指针,已经包含一个地址......发送 &s 就像发送一个地址的地址......另外,不要忘记增加那个地址s 在你的循环中,否则你会一遍又一遍地写同一个字符。

当您使用 printf(或其任何变体)时,您可以使用 %c 打印一个字符,您可以使用 %s 打印一个字符串 (char *)

【讨论】:

  • 我已经尝试过 1 而不是 STDOUT_FILENO ,但它仍然没有产生任何输出。 s + i 也没有效果。
  • sizeof(s) 将返回指针的大小,您应该使用“i
  • @Eskombro:仅当 s 是指针时。大概是一个数组。
  • 函数参数中s是一个char*,所以是指针,不是吗?
猜你喜欢
  • 2010-10-17
  • 2010-11-20
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多