C语言 无法使用 write() 写入标准输出



我正在尝试使用 write(( 编写一个字符以一次标准化一个字节。该程序编译并运行良好,但输出不太正确。现在我正在尝试让它以写入方式运行,但我在控制台中没有得到任何输出。

void myfunction(char *s, int fd, int n){
for(int i = 0; i != sizeof(s) - 1; ++i){
fprintf(stderr, "%sn", &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 %ldn", 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, %dn", &s[i])工作和fprintf(stdout, %dn", &s[i])?我相信stderr优先,但我没想到其他输出根本不会被打印出来?

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

缺少一些细节,但根据您到目前为止发布的内容,这应该可以工作:

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的指针。 但是,它不坚持(或期望(指针专门指向以 null 结尾的字符串;它可以是指向任何字符数组的指针。 由于write不假定以 null 结尾的字符串,因此您必须准确地告诉它您希望它写入多少个字符。

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

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

myfunction(buffer, 1, n);
myfunction(buffer, 2, n);
myfunction(buffer, fileno(stdout), n);
printf("STDOUT_FILENO = %dn", STDOUT_FILENO);
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 就像发送地址的地址...另外,不要忘记在循环中增加地址,否则您将一遍又一遍地写相同的字符。

使用printf(或其任何变体(时,可以使用 %c 打印字符,使用 %s 打印字符串(字符 *(

最新更新