LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 669|回复: 4

请教进程的问题

[复制链接]
发表于 2005-9-12 17:31:25 | 显示全部楼层 |阅读模式
各位大虾,小弟是个初学者,想写一个程序完成复制文件等功能,但我不想自己去处理复制的细节,想调用系统的CP命令,但在复制大文件的时候程序就会长时间停止响应,因此我想另外开一个进程来进行复制,而原来的进程就显示等待信息等。但我怎么才知道复制已经完成了呢?另外,如果我要中途结束复制,又要怎么做?我现在用SYSTEM函数调用系统的CP命令,这样无法完成边复制边显示提示信息的功能,也无法在中途中断复制。请问各位有什么好方法没?
另外,用SYSTEM调用的命令,怎么样才可以得到它的PID呢?
发表于 2005-9-12 17:38:28 | 显示全部楼层
system 调用是以SHELL的方式执行的。而且也不够灵活。建议直接用FORK EXEC系列。
man 2 fork
man 2 exec


  1. int main()
  2. {
  3.   int pid = fork();
  4.   switch(pid)
  5. {
  6.   case -1:
  7.     error ....
  8.     break;
  9.   case 0:
  10.     //child ...
  11.     execlp("cp","cp","source file","targetfile",(char *) 0);
  12.     break;
  13.   default:
  14.      printf("cping ...... pls wait...");
  15.      int s;
  16.      wait(&s);
  17.    
  18. }
  19. }
复制代码


如果想实现超时时KILL掉CP程序,可以试试 waitpid
回复 支持 反对

使用道具 举报

发表于 2005-9-12 17:43:42 | 显示全部楼层
int n ;
for (n = 0; n < 10; n++)
{
   waitpid(pid,XXXX) 有一个选项设置立即返回
   sleep(1);
}
如果没有WAIT到 kill pid

当然最好是处理子程序发送的退出信号了,查查资料吧。
回复 支持 反对

使用道具 举报

发表于 2005-9-12 18:36:36 | 显示全部楼层
建议你用sendfile系统调用.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-15 10:14:17 | 显示全部楼层
搞定了,谢谢各位大虾。
另外我还有一个问题,如果执行的程序出错,例如磁盘空间不足或者没有读写权限等,怎么样能够取得这些出错误状态啊?变量errno的值的含义是不是根据execlp执行的不同程序而不同?哪里有相关的资料呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表