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

本帖由 胡说之2003-12-08 发布。版面名称:电脑技术

  1. 马甲甲

    马甲甲 谁还没个马甲 ID:6080 VIP

    注册:
    2003-03-24
    帖子:
    282
    支持:
    142
    声望:
    153
    金钱:
    $16,921
    Re: Re: C/C++ ---- 005

    On some Unix platform, this command will be postponed until all references to the file are closed .....
     
  2. 胡说之

    胡说之 Moderator ID:5

    注册:
    2002-01-17
    帖子:
    5,203
    支持:
    4
    声望:
    0
    金钱:
    $187
    Re: Re: Re: C/C++ ---- 005

    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?
     
  3. majia041

    majia041 新手上路 ID:6647

    注册:
    2003-04-14
    帖子:
    107
    支持:
    0
    声望:
    0
    金钱:
    $13,980
    #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;
    }
    在这里我唯一不确定的就是,子进程是不是还对这个程序有引用。
    另外,是父进程自己杀了自己。子进程只是判断父进程是否死亡,如果不是就继续等待。并不是你所说的子进程杀了父进程。
     
  4. 胡说之

    胡说之 Moderator ID:5

    注册:
    2002-01-17
    帖子:
    5,203
    支持:
    4
    声望:
    0
    金钱:
    $187
    majia 041 兄,你的code测试过了?你的意思是,在child process里面谋害亲爹?
     
  5. Rabbit

    Rabbit 饿人谷支部书记 ID:260

    注册:
    2002-02-01
    帖子:
    35,107
    支持:
    34
    声望:
    0
    金钱:
    $31,127
  6. 马甲甲

    马甲甲 谁还没个马甲 ID:6080 VIP

    注册:
    2003-03-24
    帖子:
    282
    支持:
    142
    声望:
    153
    金钱:
    $16,921
    校长用的是啥Unix?

    :confused:
     
  7. majia041

    majia041 新手上路 ID:6647

    注册:
    2003-04-14
    帖子:
    107
    支持:
    0
    声望:
    0
    金钱:
    $13,980
    i ran it in redhat, compiled and worked. is there anything wrong?
     
  8. 胡说之

    胡说之 Moderator ID:5

    注册:
    2002-01-17
    帖子:
    5,203
    支持:
    4
    声望:
    0
    金钱:
    $187
    excellent, I just don't want to copy your code and compile and get it verified.

    Thanks for the insight.
     
  9. 胡说之

    胡说之 Moderator ID:5

    注册:
    2002-01-17
    帖子:
    5,203
    支持:
    4
    声望:
    0
    金钱:
    $187
    马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了?

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

    马甲甲 谁还没个马甲 ID:6080 VIP

    注册:
    2003-03-24
    帖子:
    282
    支持:
    142
    声望:
    153
    金钱:
    $16,921
    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.
     
  11. majia041

    majia041 新手上路 ID:6647

    注册:
    2003-04-14
    帖子:
    107
    支持:
    0
    声望:
    0
    金钱:
    $13,980
    没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
     
  12. 胡说之

    胡说之 Moderator ID:5

    注册:
    2002-01-17
    帖子:
    5,203
    支持:
    4
    声望:
    0
    金钱:
    $187
    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".
     
  13. chhuili

    chhuili 新手上路 ID:6570

    注册:
    2003-04-11
    帖子:
    81
    支持:
    0
    声望:
    0
    金钱:
    $13,980
    It works on Linux, AIX, HP/UX, Solaris and Mac.
     
  14. 马甲甲

    马甲甲 谁还没个马甲 ID:6080 VIP

    注册:
    2003-03-24
    帖子:
    282
    支持:
    142
    声望:
    153
    金钱:
    $16,921
    :eek:
    Solaris veteran!
    敬礼
     
  15. shusheng

    shusheng CFC 分析员 ID:9508 VIP

    注册:
    2003-07-10
    帖子:
    9,880
    支持:
    445
    声望:
    193
    金钱:
    $58,251
    unlink()是POSIX定义的标准函数。POSIX 是这样规定的。

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

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

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

分享此页面

扫描下面的二维码分享到微信!
http://news.comefromchina.com/threads/182115/page-2