小编Adi*_*dil的帖子

fflush和fsync之间的区别

我认为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()做同样的事情.有什么投入?

c windows fsync fflush

50
推荐指数
2
解决办法
4万
查看次数

通过NULL类指针调用类方法

我有以下代码片段:

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)

它运行成功.有人可以解释一下吗?

c++

38
推荐指数
6
解决办法
8466
查看次数

为什么git log在git fetch之后没有显示任何新内容?

我正在学习如何通过阅读Pro Git Book相关部分来使用Git遥控器.

如果克隆存储库,该命令会自动以名称"origin"添加该远程存储库.因此,git fetch origin从您克隆(或最后从中获取)之后,获取已推送到该服务器的任何新工作.

请务必注意,该git fetch命令仅将数据提取到本地存储库; 它不会自动将其与您的任何工作合并或修改您当前正在处理的工作.准备好后,您必须手动将其合并到您的工作中.

这是我试过的.我克隆了一个存储库并编辑了一个文件.在原始存储库中,有人更新了同一个文件并推送.然后,

  1. 我跑git fetch.它显示了一些更新进度消息.但是,git log没有显示更新.我误解了什么git fetch吗?我错过了什么吗?

  2. 我跑了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)

谢谢你支持我的愚蠢问题;-)

git git-pull git-fetch

16
推荐指数
2
解决办法
1万
查看次数

在连接失败时重用套接字描述符

在我的客户端代码中,我按照以下步骤连接到套接字:

  1. 创建套接字

    sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 连接(在发生故障时重试'x'时间)

    connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))  
    
    Run Code Online (Sandbox Code Playgroud)

    (填写后填写destAddr)

  3. 使用socket进行send()/ recv()操作:

    send(sockDesc, buffer, bufferLen, 0)  
    recv(sockDesc, buffer, bufferLen, 0)  
    
    Run Code Online (Sandbox Code Playgroud)
  4. 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()成功后收到的原因.

c sockets linux

9
推荐指数
2
解决办法
1万
查看次数

阻塞recv()的情况返回少于请求的字节

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平台感兴趣.我没有开发环境来自己检查一下.

c sockets linux solaris

8
推荐指数
2
解决办法
7974
查看次数

如果服务器关闭,阻止recv调用将挂起

另一个插座问题.

在我的客户端代码中,我发送一些数据包并从服务器端发出一些响应:


发送()

recv()< - 它正在阻塞

在send()之后,服务器立即崩溃并重新启动.与此同时,recv()正在等待.但即使在服务器启动后,接收呼叫也会挂起.我已经添加了SIGPIPE信号处理,但它仍然无法识别套接字是否已损坏.

当我取消操作时,我从recv()得到了已发出中断的错误.

有人可以帮我解决这个错误吗?

这是在Solaris计算机上运行的共享库中.

c sockets solaris

6
推荐指数
2
解决办法
3959
查看次数

在RPM包中添加许可协议

是否可以在RPM包中添加许可协议?当用户安装RPM时,它应该提示接受用户许可协议.

licensing rpm package

4
推荐指数
1
解决办法
4064
查看次数

为什么我的 git 日志输出在使用远程时同时显示 origin 和 origin/master、origin/HEAD。这些条目对我来说似乎多余

我正在浏览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)

git git-branch

4
推荐指数
1
解决办法
5049
查看次数

打印双变量内容

我尝试了以下代码片段,输出令我惊讶:

#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)

c printing double

2
推荐指数
1
解决办法
2万
查看次数

Python中库、模块、包、对象的区别

在一些教程中,对于从 DateTime 导入 DateTime 的语法,提到从 DateTime 模块导入 DateTime 对象。有人说从 DateTime 包中导入 DateTime 模块。

谁能解释正确的信息?

python python-2.7 python-3.x python-requests

0
推荐指数
1
解决办法
4921
查看次数