HP-UX General
1752653 メンバー
5866 オンライン
108788 解決策
新規ポスト

tarコマンドの応答メッセージを回避する方法について

 
解決済み
解決策を見る
M_II
時折のコントリビューター

tarコマンドの応答メッセージを回避する方法について

【環境】

マシン:C8000 Workstation
OS:HP-UX 11i V1.0
DAT Drv:Hp Storage Works DAT72(HP C7438A)
DAT:DDS4

 

 

いつも、お世話になっております。

keijirou2と申します。

 

早速ですが、掲題の件について質問させて頂きます。

C言語のsystem関数から、tarコマンドでDATへファイルを吸い上げようとしています。

不良DAT媒体の試験をしていますが、以下の応答メッセージが表示されて、応答待ちの状態になります。

--関数(コマンド)-------------------------------------------------------------------

 system("tar c /tmp/dummy")

--メッセージ-------------------------------------------------------------------------

 Tar:テープが終わりました。

 Tar:続けるためにはデバイス/ファイル名を入れてください。リターンだけでは終わります。

----------------------------------------------------------------------------------------

メイン画面の裏で実行しているので、応答状態にしたくないのですが、方法が分からないため、

教えていただければと思い投稿しました。

オプションを変えて試していますが、かんばしくありません。

 

すみませんが、よろしくお願いいたします。

 

1件の返信1
M_II
時折のコントリビューター
解決策

解決しました。

別ルートで確認したところ、tar コマンドは /dev/tty を read() 待ちで
wait してしまうので、system システムコールではどうしようもないとの
ことで、tar が何かエラーを返す場合は/dev/ttyを返す事を逆に利用して
/dev/tty を open() させないようにさせることでエラーと言う形で制御を
返す事が出来る旨、伺いました。

 
その時、頂いたサンプルプログラムのソースです。
 
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
 
main(argc, argv)
int argc;
char  *argv[];
 
{
    int    pid, status;
 
    if(*argv[1] != '/') {
        fprintf(stderr, "%s : first argument should be Full-Path\n", argv[1]);
        exit(1);
    }
 
    pid = fork();
    if (pid == 0) {        /* child proccess */
        if (setsid() == -1)
            perror("setsid"), exit(1);
        if (execv(argv[1], &argv[1]) == -1 )
            perror("exec"), exit(1);
    }
    else {                /* parent process */
        wait(&status);
        printf("Return status = %d.\n\n",WEXITSTATUS(status));
        exit(WEXITSTATUS(status));
    }
}
 
このプログラムを使用して不良媒体へのtarを実施してみたところ、期待通り
応答待ちにならずに、処理を行えました。
 
よって、当問題は解消されましたので、終了にさせていただきます。