小编col*_*ing的帖子

Linux上的文件描述符3有什么特别之处?

我正在开发一个可以在Linux和Mac OS X上运行的服务器应用程序.它是这样的:

  • 开始主要应用
  • 控制器进程的分支
  • 在控制器进程中调用lock_down()
  • 终止主要申请
  • 然后控制器进程再次分叉,创建一个工作进程
  • 最终控制器继续分支更多的工作进程

我可以使用几种方法(例如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)

c c++ linux macos

19
推荐指数
3
解决办法
1万
查看次数

为什么我在linux上看不到MSG_EOR for SOCK_SEQPACKET?

我有两个进程通过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)

c c++ linux

9
推荐指数
1
解决办法
3708
查看次数

如何使emacs对待#ifdef和#endif如'{'和'}'?

我希望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"搞乱是不行的.我该怎么办?谢谢!

c c++ emacs indentation

6
推荐指数
1
解决办法
1353
查看次数

这个递归的va_arg代码有什么问题?

我正在尝试使用变量参数列表创建泛型函数.设计的一部分是这些功能中的一些相互调用.不幸的是它似乎不起作用.如您所见,如果您运行下面的简单代码,对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)

c c++

2
推荐指数
1
解决办法
1431
查看次数

标签 统计

c ×4

c++ ×4

linux ×2

emacs ×1

indentation ×1

macos ×1