这个问题类似于“是否所有指针都保证正确地通过 void * 往返? ”,但稍微更深一些。
鉴于:
#include <stdint.h>
Run Code Online (Sandbox Code Playgroud)
int i;
int *ip1 = &i;
void *vp1 = ip1;
intptr_t x = (intptr_t)vp1;
void *vp2 = (void *)x;
int *ip2 = vp2;
Run Code Online (Sandbox Code Playgroud)
thenvp1 == vp2保证为真(即使它们可能不共享相同的二进制表示),但ip1 == ip2保证为真?即,在这种情况下平等关系是否具有传递性?
我有一个名为“waterproofposters.jsonl”的文件,具有这种类型的输出:
Regular price
100
200
300
400
500
Run Code Online (Sandbox Code Playgroud)
我需要取出每个值的 2%。我使用了以下代码:
awk '{print $1*0.98}' waterproofposters.jsonl
Run Code Online (Sandbox Code Playgroud)
然后我有以下输出:
0
98
196
294
392
490
Run Code Online (Sandbox Code Playgroud)
然后我被卡住了,因为我需要在第一行使用“常规价格”而不是“0”
我想用“常规价格”替换“0”
find . -name "waterproof.jsonl" | xargs sed -i -e 's/0/Regular price/g'
Run Code Online (Sandbox Code Playgroud)
但它会用“正常价格”替换所有的“0”
我知道 wsl 使用翻译从 Windows 内核执行的每个命令,但我的问题仍然是:
WSL 是否支持系统调用(例如消息队列),如果支持,如何支持?
每当使用任何消息队列函数时,我都会收到“函数未实现”错误。还有希望吗?
[编辑:]
int main(int argc,char* argv[]){
key_t key=MSG_KEY;
mqid=msgget(key,0660 | IPC_CREAT );
if(mqid==-1){
perror("msgget error:");
printf(" %s",strerror(errno));
}
int lenght=0,n=0;
lenght=msgrcv(mqid,&req,MAX,1,0);
if(lenght==-1){
if (errno == ENOMSG)
{
printf("\nNo message in the queue\n");
}
else
{
printf("\nError receiving message: %s\n", strerror(errno));
}
}
else
{
printf("Received a message\n");
}
printf("\nreceived %d number of bytes\n",n);
msgctl(mqid,IPC_RMID,NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 当我在 Linux 系统上运行以下 C 代码时:
printf("This is sentence 1. ");
write(STDOUT_FILENO, "This is sentence 2.\n", 20);
Run Code Online (Sandbox Code Playgroud)
我以错误的顺序得到输出:
This is sentence 2.
This is sentence 1.
Run Code Online (Sandbox Code Playgroud)
据我了解,发生这种情况是因为“printf”将数据发送到用户空间中的缓冲区,并且需要一些时间才能到达内核空间,而“write”立即将数据发送到内核空间中的缓存缓冲区。
解决此问题的一种方法是将数据从用户空间缓冲区刷新到内核空间缓冲区,如下所示:
printf("This is sentence 1. ");
fflush(stdout);
write(STDOUT_FILENO, "This is sentence 2.\n", 20);
Run Code Online (Sandbox Code Playgroud)
然后收到正确的输出:
This is sentence 1. This is sentence 2.
Run Code Online (Sandbox Code Playgroud)
我尝试解决此问题的另一种方法是尝试从 STDOUT_FILENO fd 获取标准输出流:
FILE *file = fdopen(STDOUT_FILENO, "w");
printf("This is sentence 1. ");
fflush(file);
write(STDOUT_FILENO, "This is sentence 2.\n", 20);
Run Code Online (Sandbox Code Playgroud)
但是,我得到的输出顺序错误:
This is sentence 2.
This is sentence 1.
Run Code Online (Sandbox Code Playgroud)
为了确保STDOUT_FILENO是代表stdout的fd,我将stdout转换为fd:
int …Run Code Online (Sandbox Code Playgroud)