请教Linux下面 使用execl 调用一个进程如何获得这个子进程得ID

huzhangyou 2008-02-24 06:50:48
伪代码如下:

execl("/root/ctorrent","./ctorrent","-d","a.torrent",NULL);

应该如何获得这个运行的ctorrent的进程ID呢

条件:由于系统启动了多个ctorrent程序,所以不能考虑枚举了
大家给点建议

使用
__pid_t id;
if(fork() == 0){
execl("/root/ctorrent","./ctorrent","-d","a.torrent",NULL);
id = getpid();
cout << id << endl;
}

获取不到
因为 ctorrent -d的参数 是启动后台下载

大家给点想法
...全文
612 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huzhangyou 2008-02-25
  • 打赏
  • 举报
回复
to ymmol:我的确测试过了 也的确没有获得到iD
可能和wolf说的-d参数有关系 谢谢

to 阿甘:方法的确不妥,代码我也想过那么些

to wolf:

正中下怀,昨天经过商量,决定采用pid文件的方式,/var/run/ 目录下面很多这个*.pid文件 觉得这是一个好的方法

另外程序考虑后决定使用进程间通讯来完成

谢谢大家
yuanchuang 2008-02-25
  • 打赏
  • 举报
回复
确实没看题,恍然大悟,被BS了……
独孤过儿 2008-02-25
  • 打赏
  • 举报
回复
呵呵,这次不能BS狒狒了,同意他的观点...
Wolf0403 2008-02-25
  • 打赏
  • 举报
回复
yc 没看题,鄙视一下。

既然已经是自己 fork + exec 了为什么还要用 ctorrent 的 -d 放去后台?
fork
-> ctorrent -d -> exit
-> ctorrent (daemon)
最后这个东西只与已经推出的 ctorrent 进程相关,你当然是得不到的。查看 ctorrent 的文档,是否会记录pid在某个文件;否则就不要用 -d 参数,自己做daemonize处理然后getpid。就这么简单。
pengxn 2008-02-24
  • 打赏
  • 举报
回复
楼主的意思应该是要在主进程中获子进程的ID吧.
---------------------

用fork()函数创建子进程后,子进程往往要调用6种exec函数之一用于执行另外一个程序.当进程调用exec函数的时候,该进程执行的程序完全替换为新的程序,而新程序则从其main函数开始执行.因为调用exec并不创建新的进程,所以前后的进程ID并未改变.exec只是用一个全心的程序替换当前程序的正文,数据,堆和栈资源.

所以我认为fork获取的子进程ID应该是可以正常使用的.
通过这个语句还可以查询该子进程是否存在

if (kill(nProcID, 0) < 0)
{
return false;
}
return true;


楼主说我的写发有问题,现在手头没有环境,只有等明天再测试一下了.
yuanchuang 2008-02-24
  • 打赏
  • 举报
回复
楼主的要求写法很奇怪。
fork返回便是子进程ID。

至于fork返回0时,即使获取到ID也无意义
ymmol 2008-02-24
  • 打赏
  • 举报
回复
__pid_t id;
if(fork() == 0){
execl("/root/ctorrent","./ctorrent","-d","a.torrent",NULL);
id = getpid();
cout < < id < < endl;
}
执行execl后子程序的代码段被./ctorrent替换,所以这句之后的代码不可能被执行
但子进程的进程号没变

代码是
__pid_t id;
if(fork() == 0){
id = getpid();
cout < < id < < endl;
execl("/root/ctorrent","./ctorrent","-d","a.torrent",NULL);
}
我在linux下试了行
huzhangyou 2008-02-24
  • 打赏
  • 举报
回复
to akirya:
方法一之前我已经测试过了
不对 谢谢

的确是要做进程间通讯

to pengxn:
也不对

谢谢

大家给点方法 再不行 就用进程间 共享内存了
pengxn 2008-02-24
  • 打赏
  • 举报
回复

if ((nChildPid = fork()) == 0)
{
SubPerformanceProcess(i);
exit(0);
}
else
{
Trace("The child process id is =%d",nChildPid);
}


建议直接取用fork函数的返回值,这个返回值在主,子进程中都会有返回.
只不过返回给主进程的是子进的PID号
返回给子进程的是0
  • 打赏
  • 举报
回复
1 先得到getpid试试?
2 fork返回的那个非0值就是子进程的id 做进程通讯?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧