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

最初由 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.
 
程序运行后会把那个可执行文件删除。
我另外有个问题,如果我们不用UNLINK函数,那怎么做?
 
谢谢shusheng兄指正.

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

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

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

或者

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

如果说是2的话,未免太过简单了.而且马甲甲的程序在windows(也是符合POSIX的 :D )里面行不通,要用DPFF的CODE
 
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?)
 
校长鼓动"谋杀亲爹"&"suicide"

:eek:
:D :D :D
 
最初由 majia041 发布
如果不用UNLINK怎么做?

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

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

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

不知是否行得通.
 
回shusheng:

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

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

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

问校长1个问题。你说2者结果一样是在运行直接UNLINK报错,还是在子进程里UNLINK报错?
如果是后者,那还是说明子进程对运行程序有个引用了。
我猜的,不知道对不对。
 
最初由 胡说之 发布
谢谢shusheng兄指正.

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

问校长1个问题。你说2者结果一样是在运行直接UNLINK报错,还是在子进程里UNLINK报错?
如果是后者,那还是说明子进程对运行程序有个引用了。
我猜的,不知道对不对。
 
最初由 majia041 发布
最初由 胡说之 发布
谢谢shusheng兄指正.

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

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

对不起,没说清楚.

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

你的多进程版本我没试,凭直觉接受了你的测试结果.等我饭后,试一试多进程.如果不行,我就把cygwin给废了,装RH Linux.
 
最初由 胡说之 发布
回shusheng:

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

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

可不可以加一个perror()看看返回的是什么错 ?

如果你vi /tmp/foo,让他开着,在另一个窗口里rm -f /tmp/foo, ls -l /tmp/foo会有什么结果?
 
最初由 胡说之 发布


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

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

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

不知是否行得通.

直接在父进程里:

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

:D
 
最初由 shusheng 发布


直接在父进程里:

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

:D

I got error message:

Permission denied
 
最初由 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.
 
后退
顶部