小编Kir*_*rov的帖子

使用 fgets 作为非阻塞函数 C++

我正在编写一个程序,使用函数 fgets 从 stdin 循环读取,如下所示:

while(fgets(buffer2, BUFFERSIZE , stdin) != NULL){
  //Some code  
}
Run Code Online (Sandbox Code Playgroud)

我希望我的代码是非阻塞的,也就是说:当用户当前没有输入时,我不希望程序保留在“fgets”行上。
我该怎么做?

c++ fgets nonblocking

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

为什么路由表中的路由项(通过netlink socket获取)没有网络掩码信息?

我正在编写一个程序来找出哪个网络接口最适合连接到指定的目标地址.

现在,我可以通过netlink套接字API 获取路由表,但似乎没有网络掩码信息.我读的手册rtnetlink,在所有rtattr的项目,没有网络掩码的相关信息,只是RTA_DST,RTA_SRC,RTA_GATEWAY...定义.

那么,如何检查路由表中的网络掩码信息?就像我们在route -n输出中看到的那样.

非常感谢.

sockets linux routes netlink

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

自我参数和元编程

嗯,代码说的更多(我已经对一些东西进行了硬编码,以隔离问题并缩短问题):

class wrapper:
    def __init__( self, func ):
        self.func = func
    def __call__( self, *args ):
        print( "okay, arg = ", args[0] )
        self.func( self, args )

class M( type ):
    def __new__( klass, name, bases, _dict ):
        _dict[ "f" ] = wrapper( _dict[ "f" ] ) 
        return type.__new__( klass, name, bases, _dict )

class AM( metaclass = M ):
    def __init__( self ):
        self.a = 0 
    def f( self, a ):
        self.a = a 

am = AM()
print( am.a …
Run Code Online (Sandbox Code Playgroud)

python metaprogramming

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

删除c向量的int向量数组

我宣布:

vector<int> * part = new vector<int>[indmap];
Run Code Online (Sandbox Code Playgroud)

好吧,我知道:"你为什么不申报矢量向量?".下次我会这样做,但现在我想了解更多关于我无法解决的向量的问题.

现在我想释放所有资源,我该做什么?

delete[] part;  
Run Code Online (Sandbox Code Playgroud)

但在删除数组之前,我该怎么做才能删除所有的矢量对象?

c++

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

子进程会影响父进程的环境吗?

孩子继承父母的环境”是什么意思?通过复制整个环境来继承,还是通过接收指向同一环境的指针来继承(以某种方式)?


这是我的场景:

  1. 我有一个正在运行的进程P,有自己的环境(变量)
  2. 在某个时刻,P执行fork
  3. 在(也称为子进程中)0的克隆中,执行if-statementCexecv
  4. 两个进程继续独立运行。

因此,在某个时刻,应用程序会停止正常工作。原因就是——“破碎”的环境。

有趣的是,两个环境都改变了。当我启动父进程并执行时

$ cat /proc/PID/environ
Run Code Online (Sandbox Code Playgroud)

对于父母和进程来说,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(以检查环境)时,两者都发生了更改,并且丢失了很多环境变量 - 只有标准变量存在(如 、PWDHOMEUSER)。

这怎么可能?问题出在哪里——孩子还是父母?


编辑:感谢大家的回答,我+1,因为它们都是正确的(@caf、@Saphrosit 和@R..)。这个问题的原因实在是太蠢了。。

所有环境变量都放置在/etc/profile登录后执行的位置(那..我不知道)。

嗯,看来问题是在重新启动机器时发生的。因此,在启动时,应用程序会再次启动,但/etc/profile/不会执行/读取。这会导致不良行为。这就是为什么手动重新启动时问题消失的原因 - 一旦 aroot登录(通过ssh),环境变量就会/etc/profiles被读取,并且当父进程重新启动(通过root)时,一切都很好 - 环境变量被继承。

愚蠢的错误。

c c++ unix process environment-variables

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

C变量是饱和还是环绕?

如果我继续增加C变量,它是否饱和或环绕?

c variables

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

什么可能导致多线程环境中的"错误的文件描述符"?

这个问题在某种程度上类似于Bad文件描述符,但它根本不相同.我知道这是"糟糕的问题"(可能是"过于本地化"),但我无法理解,现在我已经没有任何想法.


介绍

我有一个经理线程,启动75个其他线程.这些线程中的每一个都做了很多事情,所以我只描述相关的线程.

请注意:如果我只启动几个线程 - 例如3或5或10,则不会出现此错误!这让我觉得,这是一些多线程问题,但它似乎并不是这样的.你会在下一节中看到原因.

所以,在以下2个案例中,有时我收到此错误Bad file descriptor:


情况1

错误出现在 TinyXML

有一个xml文件,所有线程都需要它.所有这些线程都TinyXML用于解析文件.所有这些线程都只使用此文件!(我知道这可以优化,但无论如何).

因此,导致Bad file descriptor错误的代码是:

// ...
// NOTE: this is LOCAL, other threads do NOT have access to it
TiXmlDocument   doc;
doc.LoadFile( filename );

// and here's the LoadFile:
bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding )
{
    //...
    FILE* file = fopen( value.c_str (), "rb" ); 
    if ( file )
    {
        // this IS …
Run Code Online (Sandbox Code Playgroud)

c c++ linux posix file-descriptor

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

for循环的中间部分的目的

for(i = 0; str[i]; ++i)
    ++count[str[i]];

// Change count[i] so that count[i] now contains actual position of
// this character in output array
for (i = 1; i <= RANGE; ++i)
    count[i] += count[i-1];

// Build the output character array
for (i = 0; str[i]; ++i)
{
    output[count[str[i]]-1] = str[i];
    --count[str[i]];
}
Run Code Online (Sandbox Code Playgroud)

通常,for循环的中间部分有一些比较,但for这里的第一个循环只有一个表达式.你能告诉我那是什么意思吗?

c

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

Ternery操作员

unsigned char result= 0x0;
int maxX,maxY;
maxX = maxY = 0;
printf("enter input\n");
scanf("%d",&maxX);
scanf("%d",&maxY);
(maxX < 200)?(result | (1 )) :0;
(maxX > 1500)?(result | (1 <<1  )) :0;
(maxY < 200)?(result | (1 <<2  )) :0;
(maxY > 1500)?(result | (1 << 3)) :0;

printf("Result is %d\n",result);
Run Code Online (Sandbox Code Playgroud)

为什么result总是零不论maxXmaxY输入?

c operators

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

重新定义头文件中的类

我正在尝试编译我的代码g++,但它抛出这个编译错误:

Enrollment.h:3:7: error: redefinition of class sict::Enrollment
Enrollment.h:3:7: error: previous definition of class sict::Enrollment
Run Code Online (Sandbox Code Playgroud)

我的Enrollment.h:

namespace sict{
class Enrollment{
  private:
    char _name[31];
    char _code[11];
    int _year;
    int _semester;
    int _slot;
    bool _enrolled;
  public:
    Enrollment(const char* name , const char* code, int year, int semester ,  int time );
    Enrollment();
    void set(const char* , const char* , int ,int,  int , bool = false );

    void display(bool nameOnly = false)const;
    bool valid()const;
    void setEmpty();
    bool isEnrolled() const; …
Run Code Online (Sandbox Code Playgroud)

c++ class redefinition

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