亲爱的朋友们,不知道为什么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) 为什么此代码段会出现分段错误?
#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++中有一串数字:比如string str ="1234567012"
我希望将它复制到一个int数组,这样数组的每个元素都有一个数字.现在我可以使用迭代器,并一次迭代一次并使用static_cast<int>(*iter).但是,还有更简单直接的方法吗?
最后我想将int数组重新复制到一个字符串数组.
请帮助我完成上述两个步骤.
根据我的理解,当一个过程进入一个关键部分时,没有其他过程可以同时进入.但是我通过一个程序看到它不是.
我创建过程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) 我在使用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 ++)编译器.
我们的代码在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"这样的变量
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)
怎么来,如果块验证失败了?
我使用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) 为什么这个程序没有正确读取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程序来跨越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它没有增加.
可能是什么原因?