当前位置: 技术问答>linux和unix
在调用system()函数时,出现错误。
来源: 互联网 发布时间:2016-07-08
本文导语: 在使用system()函数,执行一个linux命令时,我发现单独将system(“命令”),放在一个自己写的main()中,可以执行成功;但是将同样的代码放到一个在主进程中开启的一个子线程中时,用gdb调试,返回的错误是:GDB errors...
在使用system()函数,执行一个linux命令时,我发现单独将system(“命令”),放在一个自己写的main()中,可以执行成功;但是将同样的代码放到一个在主进程中开启的一个子线程中时,用gdb调试,返回的错误是:GDB errors : Couldn't get registers: No such process。很奇怪,为什么呢?是system()这个函数的用法在多线程不安全吗?如果不安全,用exec()安全吗?
|
哦,你是在子线程里system,这样就试过了,相当于在子线程里fork。。
http://www.cppblog.com/lymons/archive/2008/06/01/51836.aspx
准则3:多线程程序里不准使用fork
这条准则是不是太严苛了,我不确定。
http://www.cppblog.com/lymons/archive/2008/06/01/51836.aspx
准则3:多线程程序里不准使用fork
这条准则是不是太严苛了,我不确定。
|
在线程里面fork一个进程在实现上确实是有冲突的:在线程fork一个子进程后,新的进程会拷贝父进程的进程空间的内容,
然后在自己的进程空间上运行;按照进程和线程的关系来看,父进程在开辟了该线程之后父进程的进程空间已经包含了该线程线程栈的内容,而在线程内操作的数据又是在该线程的线程栈内,包括fork的内容。这样在逻辑说不通
以上是我的个人理解,如果有什么不对的地方,欢迎大家指出
|
我曾经在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.");
}
楼主需要确认主线程是否还存在?主线程需要等待子线程结束之后再结束.
int ret = system("mv file_name1 file_name2 file_path");
if (ret == -1)
{
write_log(XFS_LOG_ERROR, "upload", "move file error.");
}
楼主需要确认主线程是否还存在?主线程需要等待子线程结束之后再结束.
|
system本身就fork+execl实现,所以如果你的执行进程fork没问题,应该不会有问题的啊。
贴代码来看看。
贴代码来看看。
|
没错,俺一直无法弄清楚一个多线程程序在fork后如何运行,也没有相关的文档能解答这个疑问。
所以如果真的需要多进程+多线程,俺都是首先fork,
然后在各个进程中再建立线程。
|
不用 gdb 调试结果如何呢?
system 不就是 fork + execv 嘛。多线程安全不安全,
貌似要看你的代码吧
system 不就是 fork + execv 嘛。多线程安全不安全,
貌似要看你的代码吧
|
也遇到过同样的问题,关注中。。。
|
ding...
|
贴出来你的示例代码看看
|
system 等于fork + exec 应该还加上一个waitpid
也许是子进程已经退出了。
并行程序的调试是一个问题,你可以在子进程中print些内容出来调试一下。
也许是子进程已经退出了。
并行程序的调试是一个问题,你可以在子进程中print些内容出来调试一下。
|
mark 一下,我明天试看看。是不是GDB本身的问题。system放子线程里可以正常运行么?
|
我现在也遇到这个问题
之前我也是在一个独立线程中使用system,很正常
现在还是在线程里调用,结果总是返回-1
之前我也是在一个独立线程中使用system,很正常
现在还是在线程里调用,结果总是返回-1