为什么每次遇到问题都那么头疼呢?
继续前篇的说,把sshpass的所有代码拷贝到了项目中,用ipad mini和4s做测试,从ipad mini上往4s里拷贝数据,因为不能从控制台输入,所以手动输入测试命令:
char* argvv[] = {"sshpass", "-p", "alpine", "scp", "/User/wltest/1.txt", "root@IP:/User/wltest/",0};
运行到在子进程里执行“scp。。。”命令时,会几行错误“operation not permitted”。。。
execvp(“scp”, argv );
注意:子进程里的代码是没有办法跟踪调试的,只有在控制台输出端才能看到,因为这句代码:
perror("sshpass: Failed to run command");
该问题我通过两个设备来回测试都存在。
换一种思路,直接开一个fork,然后执行sshpass的程序,就是
execvp(“sshpass”, “sshpass -p 。。。。。”);
终于看到曙光了,从ipad mini往4s里执行,成功拷贝文件,但从4s里往ipad mini里拷贝失败。
再接着找原因,在执行到fork()时返回值是-1,同样用
perror("。。。。。");查看原因,
错误原因是“operation not permitted”
在网上查找资料,都说是因为设备没有越狱造成的,但我可以很肯定的说,这个肯定越狱了,呜呜呜呜。。。为什么呢?
这两天都在纠结这个问题,现在思路在权限上,但查看了两个设备下的app的权限“ls -l”都是:
-rwxr-xr-x 1 mobile mobile 69344 Sep 17 15:58 iOSTest*
执行Fork应该没有什么问题,查了下资料,该程序都是在/var/mobile/Applications/。。。下运行,而这个目录的用户一般都是mobile,全限比较小,是这个吗?
通过测试发现一些比较有意思的现象:
在虚拟机上通过端口转发然后ssh来连接两个设备,连接上4s后进入测试程序的App目录运行“./iOSTest*",会是等待状态,一片空白,这时你再点击设备上iOSTest应用图标,这时你的虚拟机上的控制台会返回以下信息:
2014-09-17 15:52:07.097 iOSTest[1997:707] /var/root/Documents
2014-09-17 15:52:07.100 iOSTest[1997:707] this is JailBroken
fork is failed!: Operation not permitted
2014-09-17 15:52:07.819 iOSTest[1997:707] no ok
2014-09-17 15:52:07.898 iOSTest[1997:707] Applications are expected to have a root view controller at the end of application launch
注意:红字标的地方在调试和正常运行该程序的时候都是var/mobile/Applications/。。。
连接上iPad mini时,按照上述方法测试,一运行“./iOSTest*"控制台就返回:
Abort trap: 6
也就是说iPad mini这种是正常状态,因为我fork成功了,但什么也没有做。
难道是目录引起的,好消息是大牛的程序在4S下的别的目录下是可以fork的,为什么呢,怎么解决这个问题呢?