使用STRNCPY()的编译报错,删除这个语句就好了。

来源:2-13 -1 进程的心跳机制

慕先生9503595

2023-03-25

使用STRNCPY()的编译报错,删除这个语句就好了。

编译时错误信息:
g++ -g -o book book.cpp -I/project/public

/tmp/ccjWBv5x.o:在函数‘main’中:
/project/tools1/c/book.cpp:41:对‘STRNCPY(char*, unsigned long, char const*, unsigned long)’未定义的引用
collect2: 错误:ld 返回 1

主体程序:
// 进程心跳信息的结构体。
struct st_pinfo
{
int pid; // 进程id。
char pname[51]; // 进程名称,可以为空。
int timeout; // 超时时间,单位:秒。
time_t atime; // 最后一次心跳的时间,用整数表示。
};

int main(int argc,char *argv[])
{
// 帮助说明,要一个名件名的参数。
if (argc<2)
{
printf(“Using:./book procname\n”);
return 0;
}

// 获取或创建共享共存。
int m_shmid;
if ( (m_shmid=shmget(SHMKEYP_,MAXNUMP_*sizeof(struct st_pinfo),0640|IPC_CREAT))==-1 )
{ printf(“shmget(%x) failed.\n”,SHMKEYP_); return -1; }
// 共享内存创建后,系统会自己对它进行初始化。

// 将共享内存连接到当前进程的地址空间。
struct st_pinfo *m_shm;
if ( (m_shm=(struct st_pinfo *)shmat(m_shmid,0,0))==(void *)-1 )
{ printf(“shmat(%d) failed.\n”,m_shmid); return -1; }
printf(“stpinfo=%d\n”,m_shm);

// 新建一个心跳信息结构体,并存入当前进程的心跳信息。
struct st_pinfo stpinfo;
memset(&stpinfo,0,sizeof(struct st_pinfo));
stpinfo.pid=getpid(); // 进程id。
printf(“argv[1]=%s\n”,argv[1]);
STRNCPY(stpinfo.pname,51,argv[1],50); // 进程名。
//这种写法也不行: STRNCPY(stpinfo.pname,sizeof(stpinfo.pname),argv[1],50); // 进程名。
stpinfo.timeout=30; // 超时时间,单位:秒。
stpinfo.atime=time(0); // 最后一次记录心跳的时间。

写回答

1回答

长歌_吴从周

2023-03-25

要把_public.cpp一起编译。

g++ -g -o book book.cpp -I/project/public /project/public/_public.cpp


1
0

C/C++气象数据中心实战,手把手教你做工业级项目

通过技术的实际应用,掌握等同2年经验的技术能力

968 学习 · 401 问题

查看课程