精华 C/C++ ---- 005

马甲甲

谁还没个马甲
VIP
注册
2003-03-24
消息
282
荣誉分数
142
声望点数
153
  • Re: Re: C/C++ ---- 005

    最初由 chhuili 发布

    unlink(argv[0]);
    On some Unix platform, this command will be postponed until all references to the file are closed .....
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    荣誉分数
    4
    声望点数
    0
    Re: Re: Re: C/C++ ---- 005

    最初由 马甲甲 发布


    On some Unix platform, this command will be postponed until all references to the file are closed .....
    That's exactly where the trick is.

    When the program is running in memory, the original file is not closed, but in use, so how can it remove itself?
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    荣誉分数
    0
    声望点数
    0
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>

    int main(int argc, char** argv)
    {
    pid_t pt;
    if ((pt=fork()) != 0)
    {
    kill(getpid());
    }
    else
    {
    if (getppid>1) wait(getppid());
    remove(argv[0]);
    }

    return 0;
    }
    在这里我唯一不确定的就是,子进程是不是还对这个程序有引用。
    另外,是父进程自己杀了自己。子进程只是判断父进程是否死亡,如果不是就继续等待。并不是你所说的子进程杀了父进程。
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    荣誉分数
    4
    声望点数
    0
    majia 041 兄,你的code测试过了?你的意思是,在child process里面谋害亲爹?
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    荣誉分数
    0
    声望点数
    0
    i ran it in redhat, compiled and worked. is there anything wrong?
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    荣誉分数
    4
    声望点数
    0
    最初由 majia041 发布
    i ran it in redhat, compiled and worked. is there anything wrong?
    excellent, I just don't want to copy your code and compile and get it verified.

    Thanks for the insight.
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    荣誉分数
    4
    声望点数
    0
    马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了?

    从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕:D
     

    马甲甲

    谁还没个马甲
    VIP
    注册
    2003-03-24
    消息
    282
    荣誉分数
    142
    声望点数
    153
    Please run in on Solaris and AIX

    It will kill itself, however some Unix cannot, such as HP-UX.
    Solaris & AIX allow "postpone", but HP does not.
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    荣誉分数
    0
    声望点数
    0
    最初由 胡说之 发布
    马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了?

    从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕:D
    没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    荣誉分数
    4
    声望点数
    0
    That's interesting. I worked in Solaris for decade, and I didn't really notice that feature. Surely it'll impress the interviewer by knowing "postpone".
     

    chhuili

    新手上路
    注册
    2003-04-11
    消息
    81
    荣誉分数
    0
    声望点数
    0
    最初由 majia041 发布


    没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
    It works on Linux, AIX, HP/UX, Solaris and Mac.
     

    shusheng

    CFC 分析员
    VIP
    注册
    2003-07-10
    消息
    9,880
    荣誉分数
    444
    声望点数
    193
    unlink()是POSIX定义的标准函数。POSIX 是这样规定的。

    如果在unlink()时,没有别的程序打开那个文件,那么文件名被删去,文件所占的空间被释放;
    如果在unlink()时,有别的程序同时打开那个文件,那么文件名被删去,但文件所占的空间不被释放。别的(已经打开这个文件的)程序依然可以读写这文件。由于文件名被删,再也没有别人可以打开这个文件。等所有人都close()文件后,这个没有名字的文件所占的空间才被释放。

    所以 unlink(argv[0])的程序,应该可以在所有兼容POSIX的Unix上运行。如果校长的Unix不能运行上述程序,只能说明校长的Unix与Posix标准不兼容。:D

    (很多Linux都或多或少地不兼容Posix的)
     
    顶部