最近由於專案的需要,需要將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中。同時,還可以在這三個標準輸入輸出之間實現重定向,比如將錯誤資訊重定向到標準...