小编kin*_*er1的帖子

UNIX消息队列msgrcv无法接收消息

亲爱的朋友们,不知道为什么msgrcv收到空白缓冲区?

这是代码:

enter code here
 #include <sys/msg.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <stdio.h>
 #include <string.h>

 typedef struct mymsg {
  long mtype;
  char mtext[24];
 }mymsg;

 int main()
 {
  int msqid;
  mymsg msg,buff;
  msqid=msgget(IPC_PRIVATE,IPC_CREAT|IPC_EXCL);

  if(msqid==-1){
  perror("FAiled to create message queue\n");
  }
  else{
  printf("Message queue id:%u\n",msqid);
  }
  msg.mtype=1;
  strcpy(msg.mtext,"This is a message");
  if(msgsnd(msqid,&msg,sizeof(msg.mtext),0)==-1){
   perror("msgsnd failed:");
  }
  else{
   printf("Message sent successfully\n");
  }
 //ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

  // msgrcv(msqid,buff.mtext,sizeof(msg.mtext),1,0); This was error
  msgrcv(msqid,&buff,sizeof(msg.mtext),1,0);  // This is correct (Thanks to …
Run Code Online (Sandbox Code Playgroud)

c unix message-queue msgrcv

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

mmap:map_anonymous为什么会给SIGSEGV?

为什么此代码段会出现分段错误?

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>

int main()
{
    void *ptr;

    ptr=mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0);
    strcpy(ptr, "Hello");

}
Run Code Online (Sandbox Code Playgroud)

或者更好,我想:char *ptr=malloc(10);然后将此参数传递给mmap.两者都给出了SIGSEGV.

c linux mmap

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

C++:如何将字符串对象复制到int数组?

我在C++中有一串数字:比如string str ="1234567012"

  1. 我希望将它复制到一个int数组,这样数组的每个元素都有一个数字.现在我可以使用迭代器,并一次迭代一次并使用static_cast<int>(*iter).但是,还有更简单直接的方法吗?

  2. 最后我想将int数组重新复制到一个字符串数组.

请帮助我完成上述两个步骤.

c++ linux arrays string

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

当进程进入信号量(临界区)并睡眠时会发生什么?

根据我的理解,当一个过程进入一个关键部分时,没有其他过程可以同时进入.但是我通过一个程序看到它不是.

我创建过程A,子过程B.孩子进入临界区,然后睡觉,同时我很惊讶地看到父母也进入了关键部分,而孩子则睡觉.这怎么可能?在关键部分同时进行2个过程?

enter code here
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>

sem_t sem;
int shared=0;
int pid;

void func()
{
 sem_trywait(&sem);
 if(pid==0)printf("Child entered\n");
 else if(pid>0)printf("Parent entered\n");
 sleep(2);
 shared++;
 sem_post(&sem);
 if(pid==0)printf("Child exited\n");
 else if(pid>0)printf("Parent exited\n");
}

int main()
{
 pid=fork();
 sem_init(&sem,1,0);
 if(pid==0){
  printf("In child\n");
  func();
 }
 else {
 func();
}
}
Output:
 [root@dhcppc0 semaphore]# gcc semaphore1.c -lrt
 [root@dhcppc0 semaphore]# ./a.out
  In child
  Child entered
  Parent entered

  <pause 2 secs>

  Child exited
  Parent exited
Run Code Online (Sandbox Code Playgroud)

c linux semaphore critical-section

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

使用转换(STL)时出现C++错误

我在使用transform时面临编译错误:

它与我之前的问题有关:C++:如何将字符串对象复制到int数组?)

enter code here

 class BinaryCode {

    public:
            int get_digit(char c)
            {
                    return c-'0';
            }
            void decode(string decd)
            {
                    int i;

                    std::vector<int>decoded(decd.size());
                    std::transform(decd.begin(), decd.end(), decoded.begin(), get_digit);

                    int length=decoded.length();
Run Code Online (Sandbox Code Playgroud)

错误是:

enter code here

[root@localhost topcoder]# g++ prog1.c
 prog1.c: In member function `void BinaryCode::decode(std::string)':
 prog1.c:20: error: argument of type `int (BinaryCode::)(char)' does not match `int (BinaryCode::*)(char)'
Run Code Online (Sandbox Code Playgroud)

谁能帮帮我吗?我正在使用gcc(g ++)编译器.

c++ linux gcc stl transform

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

如何在C printf中使用宏?

我们的代码在printf中硬编码了至少20个不同文件的版本信息,例如: printf("Software version v11.2");这意味着每次更新时都会更改20个文件.

相反,我希望在common.h文件中使用宏和#include它,这样版本更新只是改变一个宏,就是这样.

我尝试过类似的东西:

#include <stdio.h>
#define VERSION "v11.2"
int main()
{
  printf("Trying to print macro: ", VERSION);
}
Run Code Online (Sandbox Code Playgroud)

但是这种"字符串""字符串"的样式在Java中不在C中.任何想法如何实现它?

我们将使用gcc进行编译.

注意:宏也用于一些典型的*.rc文件中,我们不能使用变量,并且某些地方使用SQL查询解析这些rc文件.所以我们不能使用像char ver [] ="v11.2"这样的变量

c linux

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

如果条件不起作用怎么办?

           rc = daoMp.retrieveSystemData(argv[2]);
           printf("rc = %d\n");
           if (rc == 0) {
               ErrLog("Mount point found\n");
               printf("Mount point found\n");
               return 4;
           }
           else {
               ErrLog("Could not retrieve system data\n");
               printf("Could not retrieve system data\n");
               return -1;
           }

Output: rc = -208814497
Mount point found
Run Code Online (Sandbox Code Playgroud)

怎么来,如果块验证失败了?

c++ linux gcc

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

为什么valgrind显示泄漏,即使释放包含动态分配对象的向量?

我使用new在堆上分配了一个向量:

std::vector<t*> *vec = new std::vector<t*>;
Run Code Online (Sandbox Code Playgroud)

此向量包含类"t"的类对象,这些类对象是使用new创建的

t *ptr1 = new t();
t *ptr2 = new t();
t *ptr3 = new t();
t *ptr4 = new t();
Run Code Online (Sandbox Code Playgroud)

现在,当我删除矢量时,预计添加到它的所有这些对象也应该被销毁,我的意思是:

std::vector<t*> *vec = new std::vector<t*>;
 vec->push_back(ptr1);
 vec->push_back(ptr2);
 vec->push_back(ptr3);
 vec->push_back(ptr4);
Run Code Online (Sandbox Code Playgroud)

ptr1指向的内存,ptr2,ptr3,ptr4也应该被释放.

但是Valgrind将此视为泄漏!!! Valgrind有问题吗?

==15634==
==15634== HEAP SUMMARY:
==15634==     in use at exit: 48 bytes in 8 blocks
==15634==   total heap usage: 12 allocs, 4 frees, 128 bytes allocated
==15634==
==15634== LEAK SUMMARY:
==15634==    definitely lost: 32 bytes in 4 blocks
==15634==    indirectly lost: …
Run Code Online (Sandbox Code Playgroud)

c++ linux valgrind vector

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

C程序从hex文件读取,给出意外输出

为什么这个程序没有正确读取hex文件?

#include <stdio.h>
#include <stdlib.h>

char *buffer;
unsigned int fileLen;
void ReadFile(char *name);


void ReadFile(char *name)
{
        FILE *file;

        file = fopen(name, "rb");
        if (!file)
        {
                fprintf(stderr, "Unable to open file %s", name);
                return;
        }

        //Getting file length
        fseek(file, 0, SEEK_END);
        fileLen=ftell(file);
        fseek(file, 0, SEEK_SET);

        //Allocating memory
        buffer=(char *)malloc(fileLen+1);
        if (!buffer)
        {
                fprintf(stderr, "Mem error!");
                                fclose(file);
                return;
        }

        fread(buffer, fileLen, 1, file);
        fclose(file);


}

int main()
{
   var32 code;
   char filename[20];
   printf("Enter the file name: ");
   scanf("%s", &filename);
   ReadFile(filename);
   printf("FIle …
Run Code Online (Sandbox Code Playgroud)

c

-1
推荐指数
1
解决办法
1463
查看次数

为什么打开文件描述符的数量不会增加?

我创建了一个小型C程序来跨越Linux中打开文件描述符的系统限制.但我可以看到门槛不会越过.

这是C代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
  int i, fd[9000];
  for(i=0; i<9000; i++)
  {
   fd[i]=open("test.txt", O_RDWR);
  }
  while(1);
}
Run Code Online (Sandbox Code Playgroud)

我希望它超越极限并给我一个错误信息.但是,如果我在后台运行它并且lsof | wc -l它没有增加.

可能是什么原因?

c linux

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

标签 统计

linux ×8

c ×6

c++ ×4

gcc ×2

arrays ×1

critical-section ×1

message-queue ×1

mmap ×1

msgrcv ×1

semaphore ×1

stl ×1

string ×1

transform ×1

unix ×1

valgrind ×1

vector ×1