当前位置: 技术问答>linux和unix
linux system()函数问题
来源: 互联网 发布时间:2016-05-26
本文导语: 大家好, 1.我在主程序里面 pthread_create(&id,NULL,(void*)cp_thread,NULL) 创建了个线程cp_thread 2.在cp_thread()函数中 system("cp * /media/disk"); 3.然后又在一 个地方使用了pthread_cancel(id); 可是问题出来了,就是当执行pthread_cancel...
大家好,
1.我在主程序里面
pthread_create(&id,NULL,(void*)cp_thread,NULL) 创建了个线程cp_thread
2.在cp_thread()函数中
system("cp * /media/disk");
3.然后又在一 个地方使用了pthread_cancel(id);
可是问题出来了,就是当执行pthread_cancel(id)时候 创建的线程是退出了,可是查看后台,system()出的cp进程 仍然在跑,并没有结束
我尝试用getpid()获取system()出的cp进程号,然后发送kill()信号,让cp进程挂起。
可是getpid()得到的却是父进程号
我想问下,在这种亲况下,如何在终止线程的同时,退出或挂起cp 进程呢?
还请知道的大哥告诉下谢谢
1.我在主程序里面
pthread_create(&id,NULL,(void*)cp_thread,NULL) 创建了个线程cp_thread
2.在cp_thread()函数中
system("cp * /media/disk");
3.然后又在一 个地方使用了pthread_cancel(id);
可是问题出来了,就是当执行pthread_cancel(id)时候 创建的线程是退出了,可是查看后台,system()出的cp进程 仍然在跑,并没有结束
我尝试用getpid()获取system()出的cp进程号,然后发送kill()信号,让cp进程挂起。
可是getpid()得到的却是父进程号
我想问下,在这种亲况下,如何在终止线程的同时,退出或挂起cp 进程呢?
还请知道的大哥告诉下谢谢
|
system 差不多是 fork + execve
你可以自己写 fork + execve "/bin/sh" "-c" "cp */media/disk" (char*)0
获取子进程号
然后就可以挂起 推出 中止 cp进程
至于 调用结果 可以用 waitpid 里的
status里判断
你可以自己写 fork + execve "/bin/sh" "-c" "cp */media/disk" (char*)0
获取子进程号
然后就可以挂起 推出 中止 cp进程
至于 调用结果 可以用 waitpid 里的
status里判断
|
可是问题出来了,就是当执行pthread_cancel(id)时候 创建的线程是退出了,可是查看后台,system()出的cp进程 仍然在跑,并没有结束
我尝试用getpid()获取system()出的cp进程号,然后发送kill()信号,让cp进程挂起。
可是getpid()得到的却是父进程号
我想问下,在这种亲况下,如何在终止线程的同时,退出或挂起cp 进程呢?
还请知道的大哥告诉下谢谢
大哥,子线程下system,等同于fork+execl,人家新开的子进程来执行命令,当然跟pthread_cancel(id)无关。
具体描述:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
先换成fork,这个便于在需要的时候kill掉。
我尝试用getpid()获取system()出的cp进程号,然后发送kill()信号,让cp进程挂起。
可是getpid()得到的却是父进程号
我想问下,在这种亲况下,如何在终止线程的同时,退出或挂起cp 进程呢?
还请知道的大哥告诉下谢谢
大哥,子线程下system,等同于fork+execl,人家新开的子进程来执行命令,当然跟pthread_cancel(id)无关。
具体描述:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
先换成fork,这个便于在需要的时候kill掉。
|
pid = fork();
if(pid)
{
} //如果换成system()界面就会起来!
execl("/bin/ls","ls", "-l", (char *) 0); //
}
用if(pid>0) //主进程
else if(pid=0) //子进程来写
你这里写的有问题,并且子进程结束的时候最好退出一下
if(pid)
{
} //如果换成system()界面就会起来!
execl("/bin/ls","ls", "-l", (char *) 0); //
}
用if(pid>0) //主进程
else if(pid=0) //子进程来写
你这里写的有问题,并且子进程结束的时候最好退出一下
|
弱弱的問一句,為啥都不去仔細讀讀man呢?
既然都懶得讀,那我就貼一下吧:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c command, and
returns after the command has been completed. During execution of the command, SIGCHLD
will be blocked, and SIGINT and SIGQUIT will be ignored.
既然都懶得讀,那我就貼一下吧:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c command, and
returns after the command has been completed. During execution of the command, SIGCHLD
will be blocked, and SIGINT and SIGQUIT will be ignored.