使用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
10
相似问题