我认为fsync()在内部执行fflush(),因此在流上使用fsync()是可以的.但是我在网络I/O下执行时会得到意想不到的结果.
我的代码片段:
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* get fd of the FILE pointer */
fd = fileno(fp);
#ifndef WIN32
ret = fsync(fd);
#else
ret = _commit(fd);
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
但似乎_commit()并没有刷新数据(我在Windows上试过并且数据是在Linux导出的文件系统上编写的).
当我将代码更改为:
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* fflush the data */
fflush(fp);
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
这次它会刷新数据.
我想知道_commit()是否与fflush()做同样的事情.有什么投入?
我有以下代码片段:
class ABC{
public:
int a;
void print(){cout<<"hello"<<endl;}
};
int main(){
ABC *ptr = NULL:
ptr->print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它运行成功.有人可以解释一下吗?
我正在学习如何通过阅读Pro Git Book的相关部分来使用Git遥控器.
如果克隆存储库,该命令会自动以名称"origin"添加该远程存储库.因此,git fetch origin从您克隆(或最后从中获取)之后,获取已推送到该服务器的任何新工作.
请务必注意,该git fetch命令仅将数据提取到本地存储库; 它不会自动将其与您的任何工作合并或修改您当前正在处理的工作.准备好后,您必须手动将其合并到您的工作中.
这是我试过的.我克隆了一个存储库并编辑了一个文件.在原始存储库中,有人更新了同一个文件并推送.然后,
我跑git fetch.它显示了一些更新进度消息.但是,git log没有显示更新.我误解了什么git fetch吗?我错过了什么吗?
我跑了git pull,我得到了
错误:您对"hello_world.c"的本地更改将被合并覆盖.中止.请在合并之前提交更改或存储更改.
在这里,我相信它也在合并并避免意外数据丢失,它会中止.
编辑: 谢谢你的回答.实际上在查看答案之前,我正在尝试自己,并通过以下命令/输出实现了相同的功能:
$ git ls-remote origin
d0006a6bfa95e0e90aa820a0e50d31a548625652 HEAD
d0006a6bfa95e0e90aa820a0e50d31a548625652 refs/heads/master
$ git ls-remote .
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431 HEAD
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431 refs/heads/master
d0006a6bfa95e0e90aa820a0e50d31a548625652 refs/remotes/origin/HEAD
d0006a6bfa95e0e90aa820a0e50d31a548625652 refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)
还有以下命令:
$git log origin --oneline
$git log --oneline
Run Code Online (Sandbox Code Playgroud)
谢谢你支持我的愚蠢问题;-)
在我的客户端代码中,我按照以下步骤连接到套接字:
创建套接字
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
Run Code Online (Sandbox Code Playgroud)连接(在发生故障时重试'x'时间)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
Run Code Online (Sandbox Code Playgroud)
(填写后填写destAddr)
使用socket进行send()/ recv()操作:
send(sockDesc, buffer, bufferLen, 0)
recv(sockDesc, buffer, bufferLen, 0)
Run Code Online (Sandbox Code Playgroud)close() 套接字描述符并退出
close(sockDesc)
Run Code Online (Sandbox Code Playgroud)如果在send()/ recv()连接断开期间,我发现我可以通过返回到步骤2进行连接.
这个解决方案好吗?我应该关闭套接字描述符并返回步骤1吗?
另一个我无法理解的有趣观察是当我停止我的echo服务器并启动客户端时.我创建了一个Socket(步骤1)并且调用connect()失败(正如预期的那样)但是我继续打电话connect(),比方说,10次.重试5次后,我启动服务器并connect()成功完成.但在send()通话期间它收到SIGPIPE错误.我想知道:
1)每次connect()失败都需要创建一个新套接字吗?根据我的理解,只要我没有在套接字上执行任何send()/ recv()它就像新的一样好,我可以重用它fd来进行connect()调用.
2)我不明白SIGPIPE服务器启动并connect()成功后收到的原因.
该recv()库函数手册页提及的是:
它返回接收的字节数.它通常返回任何可用的数据,直到请求的数量,而不是等待收到所请求的全部金额.
如果我们使用阻塞recv()调用并请求100个字节:
recv(sockDesc, buffer, size, 0); /* Where size is 100. */
Run Code Online (Sandbox Code Playgroud)
并且只有50个字节由服务器发送然后recv()被阻止,直到100个字节可用或它将返回接收50个字节.
情景可能是:
sendign只有50个字节后服务器崩溃
糟糕的协议设计,其中服务器只发送50个字节,而客户端期望100,服务器也在等待客户端的回复(即,套接字关闭连接尚未由recv将返回的服务器启动)
我对Linux/Solaris平台感兴趣.我没有开发环境来自己检查一下.
另一个插座问题.
在我的客户端代码中,我发送一些数据包并从服务器端发出一些响应:
发送()
在send()之后,服务器立即崩溃并重新启动.与此同时,recv()正在等待.但即使在服务器启动后,接收呼叫也会挂起.我已经添加了SIGPIPE信号处理,但它仍然无法识别套接字是否已损坏.
当我取消操作时,我从recv()得到了已发出中断的错误.
有人可以帮我解决这个错误吗?
这是在Solaris计算机上运行的共享库中.
我正在浏览3.1 Git 分支 - 简而言之分支中的 git 分支概念
我正在玩虚拟存储库。
git log --oneline --decorate给出以下输出。
$ git log --oneline --decorate
d0006a6 (HEAD, origin, tag: Test1, origin/master, origin/HEAD, master) Minor change
1437545 Minor change
69a948a Added Makefile
617ffeb Spell correction
6bf9b3f First commit
$ git branch
* master
$ git remote --v
origin /home/adil/work/git/repo/ (fetch)
origin /home/adil/work/git/repo/ (push)
Run Code Online (Sandbox Code Playgroud)
我不清楚起源和主人的多个条目。如 origin、origin/master、origin/HEAD、master
URL 中的示例输出给出:
f30ab (HEAD, master, testing) add feature #32 - ability to add new
Run Code Online (Sandbox Code Playgroud)
同样,我期望输出是:
d0006a6 (HEAD, tag: Test1, master) Minor change …Run Code Online (Sandbox Code Playgroud) 我尝试了以下代码片段,输出令我惊讶:
#include <stdio.h>
#include <math.h>
int main()
{
double num;
unsigned char ch;
ch = 19;
num = 1.0E+20 ;
num += ch * 1.0E+18;
printf("E18 = %lf \n",num);
printf("E18 = %e \n",num);
num = 11.0E+21 ;
num += ch * 1.0E+19;
printf("E19 = %lf <------\n",num);
printf("E19 = %e <------\n",num);
num = 11.0E+22 ;
num += ch * 1.0E+20;
printf("E20 = %lf\n",num);
printf("E20 = %e\n",num);
num = 11.0E+23 ;
num += ch * 1.0E+21;
printf("E21 = %lf\n",num);
printf("E21 = %e\n",num); …Run Code Online (Sandbox Code Playgroud) 在一些教程中,对于从 DateTime 导入 DateTime 的语法,提到从 DateTime 模块导入 DateTime 对象。有人说从 DateTime 包中导入 DateTime 模块。
谁能解释正确的信息?