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

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 .....
 
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?
 
#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;
}
在这里我唯一不确定的就是,子进程是不是还对这个程序有引用。
另外,是父进程自己杀了自己。子进程只是判断父进程是否死亡,如果不是就继续等待。并不是你所说的子进程杀了父进程。
 
majia 041 兄,你的code测试过了?你的意思是,在child process里面谋害亲爹?
 
i ran it in redhat, compiled and worked. is there anything wrong?
 
最初由 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.
 
马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了?

从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕:D
 
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.
 
最初由 胡说之 发布
马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了?

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

没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
 
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".
 
最初由 majia041 发布


没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
It works on Linux, AIX, HP/UX, Solaris and Mac.
 
unlink()是POSIX定义的标准函数。POSIX 是这样规定的。

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

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

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