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

胡说之

Moderator
注册
2002-01-17
消息
5,202
点数
0
  • 最初由 majia041 发布


    没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
    你误解了.我是指chuhuili的code直接在main里面自杀,没有用fork.这跟你用子进程有本质区别.不是指该用个remove or unlink.

    另外"谋杀亲爹"是搞笑的说法,不是严格的技术意义上的杀父进程,我明白你的程序.Good job :cool:

    TO马甲甲:
    kill itself,这是个比较模糊的说法.

    Are you sure, that after running your code, the executable file is removed from the file system? Please clerify, thanks.
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    点数
    0
    程序运行后会把那个可执行文件删除。
    我另外有个问题,如果我们不用UNLINK函数,那怎么做?
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    点数
    0
    谢谢shusheng兄指正.

    在我的系统里,用unlink, remove的结果是一样的.

    现在我来猜测什么是这道题的考点;

    1. 考察你是否知道用子进程的特点.

    或者

    2. 考察你是否知道argv[0]就是executable file本身.

    如果说是2的话,未免太过简单了.而且马甲甲的程序在windows(也是符合POSIX的 :D )里面行不通,要用DPFF的CODE
     

    马甲甲

    谁还没个马甲
    VIP
    注册
    2003-03-24
    消息
    282
    点数
    153
    kill process 比较合适,这儿用得的确不好。
    After running the toy, it is removed from file system.
    Someone mentioned it works on HP, but mine does not, I think it also depends on which verison. (complicated?)
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    点数
    0
    最初由 majia041 发布
    如果不用UNLINK怎么做?
    在子进程里:
    --------------

    sprintf(cmd, "rm %s", argv[0]);
    system(cmd);

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

    不知是否行得通.
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    点数
    0
    回shusheng:

    unlink在我的cygwin里是合法的,只是用在chhuili的code里面时return code是-1.

    所以,这并不能说明我的系统不合POSIX标准.我从NASA那里下载的系统,应该说是比较成熟的.(当然了,现在航天飞机老往下摔,我用NASA的东西是有一点底气不足 :D )
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    点数
    0
    最初由 胡说之 发布
    谢谢shusheng兄指正.

    在我的系统里,用unlink, remove的结果是一样的.

    问校长1个问题。你说2者结果一样是在运行直接UNLINK报错,还是在子进程里UNLINK报错?
    如果是后者,那还是说明子进程对运行程序有个引用了。
    我猜的,不知道对不对。
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    点数
    0
    最初由 胡说之 发布
    谢谢shusheng兄指正.

    在我的系统里,用unlink, remove的结果是一样的.

    问校长1个问题。你说2者结果一样是在运行直接UNLINK报错,还是在子进程里UNLINK报错?
    如果是后者,那还是说明子进程对运行程序有个引用了。
    我猜的,不知道对不对。
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    点数
    0
    最初由 majia041 发布
    最初由 胡说之 发布
    谢谢shusheng兄指正.

    在我的系统里,用unlink, remove的结果是一样的.

    问校长1个问题。你说2者结果一样是在运行直接UNLINK报错,还是在子进程里UNLINK报错?
    如果是后者,那还是说明子进程对运行程序有个引用了。
    我猜的,不知道对不对。
    对不起,没说清楚.

    我只在我的机器里跑了chhuili的程序,即单一进程版本,用unlink和remove是一样的.

    你的多进程版本我没试,凭直觉接受了你的测试结果.等我饭后,试一试多进程.如果不行,我就把cygwin给废了,装RH Linux.
     

    shusheng

    CFC 分析员
    VIP
    注册
    2003-07-10
    消息
    9,880
    点数
    193
    最初由 胡说之 发布
    回shusheng:

    unlink在我的cygwin里是合法的,只是用在chhuili的code里面时return code是-1.

    所以,这并不能说明我的系统不合POSIX标准.我从NASA那里下载的系统,应该说是比较成熟的.(当然了,现在航天飞机老往下摔,我用NASA的东西是有一点底气不足 :D )
    可不可以加一个perror()看看返回的是什么错 ?

    如果你vi /tmp/foo,让他开着,在另一个窗口里rm -f /tmp/foo, ls -l /tmp/foo会有什么结果?
     

    shusheng

    CFC 分析员
    VIP
    注册
    2003-07-10
    消息
    9,880
    点数
    193
    最初由 胡说之 发布


    在子进程里:
    --------------

    sprintf(cmd, "rm %s", argv[0]);
    system(cmd);

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

    不知是否行得通.
    直接在父进程里:

    execl("rm", "/bin/rm", argv[0], NULL);

    :D
     

    胡说之

    Moderator
    注册
    2002-01-17
    消息
    5,202
    点数
    0
    最初由 shusheng 发布


    直接在父进程里:

    execl("rm", "/bin/rm", argv[0], NULL);

    :D
    I got error message:

    Permission denied
     

    majia041

    新手上路
    注册
    2003-04-14
    消息
    107
    点数
    0
    最初由 majia041 发布
    #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;
    }
    there r some errors in this program, but i can't tell what they r. just kind of feeling.
     
    顶部