我正在开发一个可以在Linux和Mac OS X上运行的服务器应用程序.它是这样的:
我可以使用几种方法(例如syslog或文件)进行日志记录,但是现在我正在思考syslog."有趣"的是,除非我在下面包含#ifdef部分,否则在控制器进程中看不到任何syslog输出.
无论是否有ifdef'ed部分,工作人员都可以在Mac OS X和Linux中完美地处理日志.控制器也可以在没有#ifdef'ed部分的情况下在Mac OS X中完美记录,但是在linux上,如果我想从控制器进程看到syslog(或者那个日志文件)的任何输出,则需要ifdef.
那么,为什么呢?
static int
lock_down(void)
{
struct rlimit rl;
unsigned int n;
int fd0;
int fd1;
int fd2;
// Reset file mode mask
umask(0);
// change the working directory
if ((chdir("/")) < 0)
return EXIT_FAILURE;
// close any and all open file descriptors
if (getrlimit(RLIMIT_NOFILE, &rl))
return EXIT_FAILURE;
if (RLIM_INFINITY == rl.rlim_max)
rl.rlim_max = 1024;
for (n = 0; n < rl.rlim_max; n++) {
#ifdef __linux__ …
Run Code Online (Sandbox Code Playgroud) 我有两个进程通过socketpair()和SOCK_SEQPACKET创建的一对套接字进行通信.像这样:
int ipc_sockets[2];
socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, ipc_sockets);
Run Code Online (Sandbox Code Playgroud)
据我了解,我应该在收到SOCK_SEQPACKET记录时在"struct msghdr"的msg_flags成员中看到MSG_EOR.我在sendmsg()中设置MSG_EOR以确保记录标记为MSG_EOR,但在recvmsg()中接收时我看不到它.我甚至尝试在发送记录之前在msg_flags字段中设置MSG_EOR,但这根本没有任何区别.
我想我应该看到MSG_EOR,除非记录被缩短,例如信号,但我没有.这是为什么?
我在下面粘贴了我的发送和接收代码.
谢谢,朱尔斯
int
send_fd(int fd,
void *data,
const uint32_t len,
int fd_to_send,
uint32_t * const bytes_sent)
{
ssize_t n;
struct msghdr msg;
struct iovec iov;
memset(&msg, 0, sizeof(struct msghdr));
memset(&iov, 0, sizeof(struct iovec));
#ifdef HAVE_MSGHDR_MSG_CONTROL
union {
struct cmsghdr cm;
char control[CMSG_SPACE_SIZEOF_INT];
} control_un;
struct cmsghdr *cmptr;
msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);
memset(msg.msg_control, 0, sizeof(control_un.control));
cmptr = CMSG_FIRSTHDR(&msg);
cmptr->cmsg_len = CMSG_LEN(sizeof(int));
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
*((int *) …
Run Code Online (Sandbox Code Playgroud) 我希望emacs将"#ifdef"与缩进相对应,就像"{"和"#endif"一样对待"}".像这样:
#ifdef __linux__
#include <sys/socket.h>
#endif
int func(void)
{
int foo = 0;
#ifdef DO_STUFF
foo = do_stuff();
#endif
return foo;
}
Run Code Online (Sandbox Code Playgroud)
代替:
#ifdef __linux__
#include <sys/socket.h>
#endif
int func(void)
{
int foo = 0;
#ifdef DO_STUFF
foo = do_stuff();
#endif
return foo;
}
Run Code Online (Sandbox Code Playgroud)
用"cpp-macro"搞乱是不行的.我该怎么办?谢谢!
我正在尝试使用变量参数列表创建泛型函数.设计的一部分是这些功能中的一些相互调用.不幸的是它似乎不起作用.如您所见,如果您运行下面的简单代码,对command()的调用总是失败,但是直接调用marshal_size()会根据格式字符串"FORMAT_STRING"成功解码两个字符串"FIRST_STR_ARG"和"SECOND_STR_ARG" .
我的推理有什么问题?
示例代码与"g ++ main.cpp"或"gcc main.c"编译良好.
谢谢,
朱尔斯
#include <stdarg.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#define MARSHAL_FORMAT "%s%s"
#define FIRST_STR_ARG "THIS_IS_ARG_ONE"
#define SECOND_STR_ARG "THIS_IS_ARG_TWO"
#define d(msg__, ...) do { printf("%s@%d: "msg__"\n", __FILE__, __LINE__, ## __VA_ARGS__); } while (0)
static uint32_t
marshal_size(const char *format, ...)
{
uint32_t retv = 0;
uint8_t ub;
uint16_t uw;
uint32_t ul;
char *s;
va_list ap;
if (!format || !strlen(format))
return 0;
d("format = %s \n", format);
va_start(ap, format);
for (; '\0' != …
Run Code Online (Sandbox Code Playgroud)