马甲甲 谁还没个马甲 VIP 注册 2003-03-24 消息 283 荣誉分数 143 声望点数 153 2003-12-08 #16 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: 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,182 荣誉分数 6 声望点数 0 2003-12-08 #17 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?
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?
M majia041 新手上路 注册 2003-04-14 消息 106 荣誉分数 0 声望点数 0 2003-12-08 #18 #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; } 在这里我唯一不确定的就是,子进程是不是还对这个程序有引用。 另外,是父进程自己杀了自己。子进程只是判断父进程是否死亡,如果不是就继续等待。并不是你所说的子进程杀了父进程。
#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,182 荣誉分数 6 声望点数 0 2003-12-08 #19 majia 041 兄,你的code测试过了?你的意思是,在child process里面谋害亲爹?
M majia041 新手上路 注册 2003-04-14 消息 106 荣誉分数 0 声望点数 0 2003-12-08 #22 i ran it in redhat, compiled and worked. is there anything wrong?
胡说之 Moderator 注册 2002-01-17 消息 5,182 荣誉分数 6 声望点数 0 2003-12-08 #23 最初由 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.
最初由 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,182 荣誉分数 6 声望点数 0 2003-12-08 #24 马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了? 从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕
马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了? 从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕
马甲甲 谁还没个马甲 VIP 注册 2003-03-24 消息 283 荣誉分数 143 声望点数 153 2003-12-08 #25 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.
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.
M majia041 新手上路 注册 2003-04-14 消息 106 荣誉分数 0 声望点数 0 2003-12-08 #26 最初由 胡说之 发布 马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了? 从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕 点击展开... 没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
最初由 胡说之 发布 马甲甲:你能肯定unlike(argv[0])在你的UNIX里行得通?编译并且run过了? 从基本原理上说,这样是行不通的.跟用什么UNIX没有关系. 我用的cygwin, 是在windows环境里的UNIX仿真系统,有不少牛B的机构支持这个系统,里面的工具很全.不想在硬盘上装两个OS,怕 点击展开... 没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK
胡说之 Moderator 注册 2002-01-17 消息 5,182 荣誉分数 6 声望点数 0 2003-12-08 #27 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".
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".
C chhuili 新手上路 注册 2003-04-11 消息 81 荣誉分数 0 声望点数 0 2003-12-08 #28 最初由 majia041 发布 没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK 点击展开... It works on Linux, AIX, HP/UX, Solaris and Mac.
最初由 majia041 发布 没问题啊,我在REDHAT下试了。另外REMOVE也是调用UNLINK 点击展开... It works on Linux, AIX, HP/UX, Solaris and Mac.
shusheng CFC 分析员 VIP 注册 2003-07-10 消息 9,868 荣誉分数 440 声望点数 193 2003-12-08 #30 unlink()是POSIX定义的标准函数。POSIX 是这样规定的。 如果在unlink()时,没有别的程序打开那个文件,那么文件名被删去,文件所占的空间被释放; 如果在unlink()时,有别的程序同时打开那个文件,那么文件名被删去,但文件所占的空间不被释放。别的(已经打开这个文件的)程序依然可以读写这文件。由于文件名被删,再也没有别人可以打开这个文件。等所有人都close()文件后,这个没有名字的文件所占的空间才被释放。 所以 unlink(argv[0])的程序,应该可以在所有兼容POSIX的Unix上运行。如果校长的Unix不能运行上述程序,只能说明校长的Unix与Posix标准不兼容。 (很多Linux都或多或少地不兼容Posix的)
unlink()是POSIX定义的标准函数。POSIX 是这样规定的。 如果在unlink()时,没有别的程序打开那个文件,那么文件名被删去,文件所占的空间被释放; 如果在unlink()时,有别的程序同时打开那个文件,那么文件名被删去,但文件所占的空间不被释放。别的(已经打开这个文件的)程序依然可以读写这文件。由于文件名被删,再也没有别人可以打开这个文件。等所有人都close()文件后,这个没有名字的文件所占的空间才被释放。 所以 unlink(argv[0])的程序,应该可以在所有兼容POSIX的Unix上运行。如果校长的Unix不能运行上述程序,只能说明校长的Unix与Posix标准不兼容。 (很多Linux都或多或少地不兼容Posix的)