在调用system()函数时,出现错误。

冷卡卡西 2009-05-23 03:55:34
在使用system()函数,执行一个linux命令时,我发现单独将system(“命令”),放在一个自己写的main()中,可以执行成功;但是将同样的代码放到一个在主进程中开启的一个子线程中时,用gdb调试,返回的错误是:GDB errors : Couldn't get registers: No such process。很奇怪,为什么呢?是system()这个函数的用法在多线程不安全吗?如果不安全,用exec()安全吗?
...全文
782 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
时刻准备中 2009-10-17
  • 打赏
  • 举报
回复
我曾经在pthread_create创建的线程中调用system,连续运行一个月也没出现过错误,如下:
int ret = system("mv file_name1 file_name2 file_path");
if (ret == -1)
{
write_log(XFS_LOG_ERROR, "upload", "move file error.");
}
楼主需要确认主线程是否还存在?主线程需要等待子线程结束之后再结束.
mymtom 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 msda 的回复:]
引用 6 楼 hairetz 的回复:
哦,你是在子线程里system,这样就试过了,相当于在子线程里fork。。

http://www.cppblog.com/lymons/archive/2008/06/01/51836.aspx

准则3:多线程程序里不准使用fork

这条准则是不是太严苛了,我不确定。

在线程里面fork一个进程在实现上确实是有冲突的:在线程fork一个子进程后,新的进程会拷贝父进程的进程空间的内容,
然后在自己的进程空间上运行;按照进程和线程的关系来看,父进程在开辟了该线程之后父进程的进程空间已经包含了该线程线程栈的内容,而在线程内操作的数据又是在该线程的线程栈内,包括fork的内容。这样在逻辑说不通

以上是我的个人理解,如果有什么不对的地方,欢迎大家指出
[/Quote]
没错,俺一直无法弄清楚一个多线程程序在fork后如何运行,也没有相关的文档能解答这个疑问。
所以如果真的需要多进程+多线程,俺都是首先fork,
然后在各个进程中再建立线程。
lin2yatou 2009-10-17
  • 打赏
  • 举报
回复
watching
glq2000 2009-09-25
  • 打赏
  • 举报
回复
I will watching this promblem
glq2000 2009-09-25
  • 打赏
  • 举报
回复
持续关注中
jiangfeng999 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hairetz 的回复:]
哦,你是在子线程里system,这样就试过了,相当于在子线程里fork。。

http://www.cppblog.com/lymons/archive/2008/06/01/51836.aspx

准则3:多线程程序里不准使用fork

这条准则是不是太严苛了,我不确定。
[/Quote]
在线程里面fork一个进程在实现上确实是有冲突的:在线程fork一个子进程后,新的进程会拷贝父进程的进程空间的内容,
然后在自己的进程空间上运行;按照进程和线程的关系来看,父进程在开辟了该线程之后父进程的进程空间已经包含了该线程线程栈的内容,而在线程内操作的数据又是在该线程的线程栈内,包括fork的内容。这样在逻辑说不通

以上是我的个人理解,如果有什么不对的地方,欢迎大家指出
kongrenxin 2009-06-30
  • 打赏
  • 举报
回复
我现在也遇到这个问题
之前我也是在一个独立线程中使用system,很正常
现在还是在线程里调用,结果总是返回-1
牛不得 2009-05-25
  • 打赏
  • 举报
回复
mark 一下,我明天试看看。是不是GDB本身的问题。system放子线程里可以正常运行么?
zhaoyanbai 2009-05-24
  • 打赏
  • 举报
回复
该文为我会继续关注中。。
fibbery 2009-05-24
  • 打赏
  • 举报
回复
system 等于fork + exec 应该还加上一个waitpid


也许是子进程已经退出了。

并行程序的调试是一个问题,你可以在子进程中print些内容出来调试一下。
zhaoyanbai 2009-05-24
  • 打赏
  • 举报
回复
Thanks Very Much...
zhaoyanbai 2009-05-24
  • 打赏
  • 举报
回复
Thanks..............
zhaoyanbai 2009-05-24
  • 打赏
  • 举报
回复
谢谢大家~
  • 打赏
  • 举报
回复
哦,你是在子线程里system,这样就试过了,相当于在子线程里fork。。

http://www.cppblog.com/lymons/archive/2008/06/01/51836.aspx

准则3:多线程程序里不准使用fork

这条准则是不是太严苛了,我不确定。

  • 打赏
  • 举报
回复
system本身就fork+execl实现,所以如果你的执行进程fork没问题,应该不会有问题的啊。
贴代码来看看。
xhy_851221 2009-05-23
  • 打赏
  • 举报
回复
贴出来你的示例代码看看
morris88 2009-05-23
  • 打赏
  • 举报
回复
不用 gdb 调试结果如何呢?

system 不就是 fork + execv 嘛。多线程安全不安全,
貌似要看你的代码吧

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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