デーモンプロセスからコンソールに出力する

start-stop-daemon で -b を指定し、バックグラウンドプロセスにすると標準入力や標準出力が切り離されるため、 printf の文字出力が行われません。

printf を行いたい場合のサンプルプログラムです。

サンプルプログラム

わかりやすいように loop() 関数がメイン処理だとします。

変更前プログラム

#include <stdio.h>

int loop(){
    int i=0;
    while(1){
        printf("hello %d\n",i++);
        sleep(5);
    }
}

int main(int argc, char *argv[]){
    loop();
}

変更後プログラム

標準出力(1)と標準エラー出力(2)を close() し、代わりに dup()を使い /dev/console につなぎかえてから loop()関数を呼び出しています。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> 

#define NEWFILE  (O_WRONLY|O_SYNC)
#define CONSOLE "/dev/console"

int loop(){
    int i=0;
    while(1){
        printf("hello %d\n",i++);
        sleep(5);
    }
}

int main(int argc, char *argv[]){
    int fd;

    /* コンソールのopen */
    fd = open(CONSOLE,NEWFILE,0644);
    if(fd<0){
        perror(CONSOLE);
        exit(1);
    }

    /* 標準出力と標準エラー出力のclose */
    close(1);
    close(2);

    /* consoleを標準出力に複製する */
    if(dup2(fd, 1) < 0){
        perror("dup");
        exit(2);
    }

    /* consoleを標準エラー出力に複製する */
    if(dup2(fd, 2) < 0){
        perror("dup");
        exit(3);
    }

    /* コンソールは閉じてしまう */
    close(fd);

    /* メイン処理の呼び出し */
    loop();
}

こうすると CATの場合 /dev/console はシリアルポートなので、シリアルポートに printf が出力されます。

関連