[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:26261] Re: auto-apt syscall wrapper



高宮です。

On Wed, Jan 03, 2001 at 10:13:28AM +0900, Hiroyuki Shimada wrote:
> > syscall を使うのが一般的、かつ簡単だと思います。
> 
>  syscall() システム・コールについては、libc6-dev を入れているのですが、
> man には登録されていませんでした。rgrep してみたところ、unistd.h に次の
> ように宣言がありましたが、何のために使うのか把握できていません。
>  Google で検索しても、syscall() についての説明は見つかりませんでした。
まず、syscall() はシステムコールではありません。
(いや、わかっていらっしゃるとは思うんですが、一応...)
syscall() はあまり有名ではないみたいですね。

> #ifdef __USE_MISC
> /* Invoke `system call' number SYSNO, passing it the remaining arguments.
>    This is completely system-dependent, and not often useful.
> 
>    In Unix, `syscall' sets `errno' for all errors and most calls return -1
>    for errors; in many systems you cannot pass arguments or get return
>    values for all system calls (`pipe', `fork', and `getppid' typically
>    among them).
> 
>    In Mach, all system calls take normal arguments and always return an
>    error code (zero for success).  */
> extern long int syscall __P ((long int __sysno, ...));
> 
> #endif  /* Use misc.  */

僕も何のために syscall() が存在するのかそのへんの経緯は知りませんが、
*おそらく* 簡単にシステムコールの wrapper が書けるようにするためだと思います。
(ほんと?)

> /* Invoke `system call' number SYSNO, passing it the remaining arguments.
>    This is completely system-dependent, and not often useful.
なんて書いてありますが、けっこう移植性は良くてほとんどの UNIX にはちゃんとあります。
さらに今回の場合は Linux(glibc) に限ったはなしなので、移植性等は問題ないはずです。

> 
> > 僕はチェックポインティングのライブラリを書いたりしているのですが、
> > チェックポインティング時の状態を保存するために、
> > たとえば open(2) を wrap して、
> > 開いたファイルディスクリプタの状態だとか、
> > lseek(2) を wrap してオフセットの状態を保存しておく必要性が出てくるわけです。
> > (そして, failure の際にこれらの情報を復元する)
> 
>  もし、(この場合ファイル関係の操作ですが)1 アプリケーションのなかのみ
> 状態を保存するのであれば、クラスを 1 つ作ればすむのではないでしょうか。
>  もし、システム全体にわたってと言うのであれば、だめでしょうけど。
> 
> ===== FileOperator.h =====
> #include <string>
> #include <fcntl.h>
> #include <unistd.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> 
> class TFileOperator
> {
> private:
>     std::string m_FileName;
>     int         m_Fd;
>     int         m_Flags;
>     mode_t      m_Mode;
> 
>     // 必要があればいろいろな状態を保持するメンバ変数
>     int         m_StateA;
>     int         m_StateB;
> protected:
>     virtual void SetStateA(int State);
>     virtual void SetStateB(int State);
>     virtual int  GetStateA() const;
>     virtual int  GetStateB() const;
> public:
>     TFileOperator();
>     virtual ~TFileOperator();
> 
>     virtual void SetFileName(std::string FileName);
>     virtual void SetFlags(int Flags);
>     virtual void SetMode(int Mode);
>     virtual int  Open();
>     virtual int  Close();
             (snip!)

いや、これだと transparent じゃなくなっちゃいますよね。
元のプログラムを書き換えなきゃいけなくなってしまう。

やろうとしていること (やったこと)
は島田さんのコードとほぼ同じことです。

# やっぱり debian-users とはあまり関係なくなってきてしまいました... (^^;

---
たかみや
東工大情報科学科松岡研