Linux下日誌重定向

2021-10-01 22:55:38 字數 3639 閱讀 1959

最近由於專案的需要,需要將ipc中的日誌同步到sd卡中,以便後續ipc出現問題了進行分析。由於我們程式的架構是多程序的,為了將所有程序的日誌同步到sd卡中,程序間需要傳遞檔案描述符,然後將該描述符重定向即可。

#include #include #include #include #include #include #include #define  std_out       (1)

#define controllen cmsg_len(sizeof(int))

static struct cmsghdr *cmptr = null; /* malloc'ed first time */

int recv_fd(int fd)

msg.msg_control = cmptr;

msg.msg_controllen = controllen;

if((nr = recvmsg(fd, &msg, 0)) < 0)

else if(nr == 0)

/** see if this is the final data with null & status. null

* is next to last byte to buffer; status byte is last byte.

* zero status means there is a file descriptor to receive.

*/for(ptr = buf; ptr < &buf[nr];)

status = *ptr & 0xff; /* prevent sign extension */

if(status == 0)

newfd = *(int *)cmsg_data(cmptr);

}else

nr -= 2;}}

/* final data has arrived */

if(status >= 0)

}}int main()

addr_client.sun_family = af_unix;

strcpy(addr_client.sun_path, path);

length = sizeof(addr_client.sun_family) + sizeof(addr_client.sun_path);

printf("start connecting to the server\n");

ret = connect(sockfd, (struct sockaddr*)&addr_client, length);

if(ret < 0)

printf("connection to server successful, wait recv server send fd...\n");

recvfd = recv_fd(sockfd);

if(recvfd < 0)

printf("recv fd is %d\n", recvfd);

//重定向檔案描述符

dup2(recvfd, std_out);

for (i=0; i<10; i++)

return 0;

}

#include #include #include #include #include #include #include #include #include #include #include #define  std_out       (1)

#define controllen cmsg_len(sizeof(int))

static struct cmsghdr *cmptr = null; /* malloc'ed first time */

int send_fd(int fd, int fd_to_send)

}else

cmptr->cmsg_level = sol_socket;

cmptr->cmsg_type = scm_rights;

cmptr->cmsg_len = controllen;

msg.msg_control = cmptr;

msg.msg_controllen = controllen;

*(int *)cmsg_data(cmptr) = fd_to_send; /* the fd to pass */

buf[1] = 0; /* zero status means ok */

}buf[0] = 0; /* null byte flag to recv_fd() */

if(sendmsg(fd, &msg, 0) != 2)

return(-1);

return(0);

}int main(int argc, char *ar**)

chmod(path2, 0777);

printf("open %s fd is %d\n",path2, recvfd);

dup2(recvfd, std_out);

fdsock = socket(af_unix, sock_stream, 0);

if(-1 == fdsock)

memset(&addr_server, 0, sizeof(addr_server));

addr_server.sun_family = af_unix;

strcpy(addr_server.sun_path, path1);

len = sizeof(struct sockaddr_un);

unlink(addr_server.sun_path);

ret = setsockopt(fdsock, sol_socket, so_reuseaddr, &on, sizeof(on) );

if(ret < 0)

printf("start bind...\n");

ret = bind(fdsock, (struct sockaddr*)&addr_server, len);

if(ret < 0)

printf("start listen...\n");

ret = listen(fdsock,1);

if(ret < 0)

printf("start accept...\n");

fdaccept = accept(fdsock, (struct sockaddr*)&addr_server, &len);

if(ret < 0)

/* 向已經連線的client傳遞檔案描述符 */

printf("start passing the fd to the client...\n");

send_fd(fdaccept, recvfd);

printf("send fd to client ...\n");

for (i=0; i<10; i++)

return 0;

}

編譯執行結果如下:

日誌 重定向

python 將終端 terminal 或者控制台的輸出結果輸出至 log 檔案 以檔案形式儲存 重定義 logger 類,然後 sys.stdout logger log檔名及路徑 import sys class logger object def init self,logfile defau...

Linux下Shell重定向

1.標準輸入,標準輸出與標準錯誤輸出 linux下系統開啟3個檔案,標準輸入,標準輸出,標準錯誤輸出。標準輸入 從鍵盤輸入資料,即從鍵盤讀入資料。標準輸出 把資料輸出到終端上。標準錯誤輸出 把標準錯誤輸出到終端上。預設的標準輸入指的是鍵盤,預設的標準輸出與標準錯誤輸出指的是螢幕或者是終端。系統為這三...

linux 下的輸出重定向

linux shell 環境中支援輸入輸出重定向,用符號 和 來表示。0 1和2分別表示標準輸入 標準輸出和標準錯誤資訊輸出,可以用來指定需要重定向的標準輸入或輸出,比如 2 a.txt 表示將錯誤資訊輸出到檔案a.txt中。同時,還可以在這三個標準輸入輸出之間實現重定向,比如將錯誤資訊重定向到標準...