4

実行中の実行可能ファイルに書き込む必要がありますが、書き込み用に開くことができません。例えば:

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

int main(int argc, char **argv)
{
    int fd = open(argv[0], O_RDWR);
    if (fd == -1) perror(NULL);
    return 0;
}
% uname -rs
FreeBSD 8.0-STABLE
% ./example_ETXTBSY
テキスト ファイルがビジーです

Linux の ETXTBSY とは一体何なのか、いくつかの説明がありますが、それでも、このエラーを無効にすることは可能ですか?

PS
ウイルスを書き込もうとしているわけではありません。

4

1 に答える 1

9

実行ファイルをその場で変更するのではなく、実行ファイルを置き換えようとしている場合は、最初に unlink() してから書き込み用に開くことができます。

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
    unlink(argv[0]);
    int fd = open(argv[0], O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO);
        if (fd == -1) perror(NULL);
            return 0;
}

実際に実行中のプロセスにアクセスしようとしている場合、最善の策は ptrace() です。

(モードビットを追加するために編集されました。)

于 2009-12-12T12:42:08.660 に答える