我有一个客户端和服务器代码。当用户在客户端上键入错误的命令(如run cat)时,服务器会显示exec错误(没有此类文件或目录)。我想将此消息写入sock,以便客户端显示它。
以下是我服务器代码的摘录:
pd = fork();
if(pd < 0)
perror("Fork Error");
if(pd != 0)
{
strcpy(sp[i].pname, param) ;
sp[i].pdd = pd;
sp[i].active = 1;
i++;
if(sp[i].active==1){
write(sock, "Done", sizeof("Done"));
}
}
if(pd == 0)
{
if(execlp(param, NULL) < 0);
{
perror("Exec error: ");
exit(20);
}
}
}
else write(sock, "Invalid", sizeof("Invalid"));
}
答案 0 :(得分:1)
你有两个相对无痛的选择。
第一个只是使用strerror
格式化错误字符串。
char buffer[200];
if (execlp(param, NULL) < 0)
{
len = snprintf(buffer, sizeof(buffer), "execlp failed %s\n", strerror(errno));
write(sock, buffer, len);
// do something
}
第二个是printf
家族的Glibc扩展。 %m
字面上确实strerror(errno)
,你甚至不需要提供errno
作为参数。同样的结果,更方便一点。
if (execlp(param, NULL) < 0)
{
int len = snprintf(buffer, sizeof(buffer), "execlp failed %m\n");
write(sock, buffer, len);
// do something
}
请注意,这假设您使用换行符分隔邮件。如果您正在使用其他一些消息方案,则可能必须在消息前面加上其长度或诸如此类的内容。 (并且,与往常一样,套接字读/写应该在循环中完成,以确保传输整个消息。)