linux下system();函数用这用这,不能用了

时间:2021-08-01 03:38:54
我在程序中频繁的
system("umount /usr/local/thunder/medias/");
system("mount /dev/hda2 /usr/local/thunder/medias/");
一保证文件被传送的正确的位子,可是一段时间大概是460次的时候,发现system()函数不执行了。
这么会事啊???
请高手帮忙。

107 个解决方案

#1


你这不是折腾内核嘛?
就不能设计好点的逻辑,只挂载一次?

#2


不能频繁挂载吧。。。前几天看见一个帖子也是说频繁挂载最后就不能用了,像2l说的,设计好点吧

#3


查看日志。找原因。

#4


看到一句话“一般ext3的文件系统默认在挂载32次或者半年就需要检查一次”。可能是因为频繁挂载的导致系统检查文件系统的原因,是system不能使用吧

#5


http://it.kswchina.com/Linux/zh/415486.html
频繁挂载对硬件的损坏,可能系统默认有保护硬盘功能吧。愚见

#6


引用楼主 saksak 的回复:
我在程序中频繁的
 system("umount /usr/local/thunder/medias/");
 system("mount /dev/hda2 /usr/local/thunder/medias/");
 一保证文件被传送的正确的位子,可是一段时间大概是460次的时候,发现system()函数不执行了。
 这么会事啊???
 请高手帮忙。


不明白为什么要重新挂载多次
如果没有刷新,可以试试 system("sync");

#7


真没必要这样搞吧,我挂载多了,挂不上都是直接重启。

#8


问题是跟了一下,system返回 -1 之后的system全都不管用了。怎么解决呢。

#9


引用 8 楼 saksak 的回复:
问题是跟了一下,system返回 -1 之后的system全都不管用了。怎么解决呢。


根本问题是你要修改逻辑,不要重复挂载

#10


检查 mount 的提示信息和返回值。

#11


修改后不挂载了。system ("reboot")返回 -1 为什么???

#12


什么地方会影响system的使用。

#13


不挂载也出错啊,一个SYSTEM出错了,以后的都不能用了。这怎么办。 

#14


本身 就有 mount 函数,不需要用system。
除非万不得已,否则不用system。

#15


查出点线索了,用showmem()函数发现内存有泄露的地方。程序很长,有什么好办法找到啊。

#16


引用 15 楼 saksak 的回复:
查出点线索了,用showmem()函数发现内存有泄露的地方。程序很长,有什么好办法找到啊。

用Valgrind

#17


反复挂载就是个很糟糕的设计,即使现在查出问题出在哪里,将来在其他地方同样会泄漏。

#18


愚见:
sync也并不能完全保证文件写入磁盘,仅仅将内容放入写队列中了,并不等待实际写磁盘操作结束。
但是频繁卸载和安装一段时间之后,确实会导致系统检查磁盘。
fsync只对文件描述指定的单一文件起作用,并且等待写磁盘操作结束。

建议使用fsync!

#19


fsync 试了,还是不行。

#20


Valgrind  网上说,这个工具只能处理简单的程序。Insure++ 更好,谁用过呀,给点资料呗。
问了一天啦,谢谢大家的帮助。

#21


关注

#22


如果只是要同步写操作,sync 足够了……

       According to the standard specification (e.g., POSIX.1-2001), sync() schedules the writes, but  may  return  before
       the  actual writing is done.  However, since version 1.3.20 Linux does actually wait.  (This still does not guaran‐
       tee data integrity: modern disks have large caches.)

自从 1.3.20 起,就已经改成等待同步结束再返回了。

#23


程序跑到结束的时候,printf还能用。SYSTEM就不能用了。用showmem看了一下。33XXXXXX 到了 25XXXXXX  按说这也够执行SYSTEM 的啊。真不明白。

#24


真的 假的!

#25


不错真不错

#26


study

#27


感觉有点晕  呵呵正在学习仲

#28


不知道

#29


学习!

#30


上百度啊

#31


gz

#32


呵呵,逻辑问题

#33


有知道system();在什么情况下无法执行吗??有内存要求最低是多少?

#34


system()->fork() or vfork(). It will cause many zombie process. And system process number is a limited number. So if you call system() many times. It will cause the system crash.

#35


try unlink().

#36


看到一句话“一般ext3的文件系统默认在挂载32次或者半年就需要检查一次”。可能是因为频繁挂载的导致系统检查文件系统的原因,是system不能使用吧

#37


#38


你这不是折腾内核嘛? 
就不能设计好点的逻辑,只挂载一次?

#39


jjjff

#40


同意36楼

#41


我是来学习的

#42


#43


学习了。。。

#44


#45


学习

#46


mark

#47


什么地方会影响system的使用,我是来学习的

#48


顶!!!!!!

#49


直接调用系统函数 system(),只建议偶尔用用,不建议频繁使用,尤其是在循环语句里反复调用,因为里面的命令不是原子性的操作,可能有很多想不到的情况发生。

要实现某些方面的功能,最好的方式就是查看源代码(Linux开源就是有这个好处啊,为什么不呢),比如
system("mount ...");
system("cp ....");
我们可以直接在utils包里直接找到mount cp 等命令实现的源代码,进而可以发现他们调用了哪些更底层的系统函数。

#50



#1


你这不是折腾内核嘛?
就不能设计好点的逻辑,只挂载一次?

#2


不能频繁挂载吧。。。前几天看见一个帖子也是说频繁挂载最后就不能用了,像2l说的,设计好点吧

#3


查看日志。找原因。

#4


看到一句话“一般ext3的文件系统默认在挂载32次或者半年就需要检查一次”。可能是因为频繁挂载的导致系统检查文件系统的原因,是system不能使用吧

#5


http://it.kswchina.com/Linux/zh/415486.html
频繁挂载对硬件的损坏,可能系统默认有保护硬盘功能吧。愚见

#6


引用楼主 saksak 的回复:
我在程序中频繁的
 system("umount /usr/local/thunder/medias/");
 system("mount /dev/hda2 /usr/local/thunder/medias/");
 一保证文件被传送的正确的位子,可是一段时间大概是460次的时候,发现system()函数不执行了。
 这么会事啊???
 请高手帮忙。


不明白为什么要重新挂载多次
如果没有刷新,可以试试 system("sync");

#7


真没必要这样搞吧,我挂载多了,挂不上都是直接重启。

#8


问题是跟了一下,system返回 -1 之后的system全都不管用了。怎么解决呢。

#9


引用 8 楼 saksak 的回复:
问题是跟了一下,system返回 -1 之后的system全都不管用了。怎么解决呢。


根本问题是你要修改逻辑,不要重复挂载

#10


检查 mount 的提示信息和返回值。

#11


修改后不挂载了。system ("reboot")返回 -1 为什么???

#12


什么地方会影响system的使用。

#13


不挂载也出错啊,一个SYSTEM出错了,以后的都不能用了。这怎么办。 

#14


本身 就有 mount 函数,不需要用system。
除非万不得已,否则不用system。

#15


查出点线索了,用showmem()函数发现内存有泄露的地方。程序很长,有什么好办法找到啊。

#16


引用 15 楼 saksak 的回复:
查出点线索了,用showmem()函数发现内存有泄露的地方。程序很长,有什么好办法找到啊。

用Valgrind

#17


反复挂载就是个很糟糕的设计,即使现在查出问题出在哪里,将来在其他地方同样会泄漏。

#18


愚见:
sync也并不能完全保证文件写入磁盘,仅仅将内容放入写队列中了,并不等待实际写磁盘操作结束。
但是频繁卸载和安装一段时间之后,确实会导致系统检查磁盘。
fsync只对文件描述指定的单一文件起作用,并且等待写磁盘操作结束。

建议使用fsync!

#19


fsync 试了,还是不行。

#20


Valgrind  网上说,这个工具只能处理简单的程序。Insure++ 更好,谁用过呀,给点资料呗。
问了一天啦,谢谢大家的帮助。

#21


关注

#22


如果只是要同步写操作,sync 足够了……

       According to the standard specification (e.g., POSIX.1-2001), sync() schedules the writes, but  may  return  before
       the  actual writing is done.  However, since version 1.3.20 Linux does actually wait.  (This still does not guaran‐
       tee data integrity: modern disks have large caches.)

自从 1.3.20 起,就已经改成等待同步结束再返回了。

#23


程序跑到结束的时候,printf还能用。SYSTEM就不能用了。用showmem看了一下。33XXXXXX 到了 25XXXXXX  按说这也够执行SYSTEM 的啊。真不明白。

#24


真的 假的!

#25


不错真不错

#26


study

#27


感觉有点晕  呵呵正在学习仲

#28


不知道

#29


学习!

#30


上百度啊

#31


gz

#32


呵呵,逻辑问题

#33


有知道system();在什么情况下无法执行吗??有内存要求最低是多少?

#34


system()->fork() or vfork(). It will cause many zombie process. And system process number is a limited number. So if you call system() many times. It will cause the system crash.

#35


try unlink().

#36


看到一句话“一般ext3的文件系统默认在挂载32次或者半年就需要检查一次”。可能是因为频繁挂载的导致系统检查文件系统的原因,是system不能使用吧

#37


#38


你这不是折腾内核嘛? 
就不能设计好点的逻辑,只挂载一次?

#39


jjjff

#40


同意36楼

#41


我是来学习的

#42


#43


学习了。。。

#44


#45


学习

#46


mark

#47


什么地方会影响system的使用,我是来学习的

#48


顶!!!!!!

#49


直接调用系统函数 system(),只建议偶尔用用,不建议频繁使用,尤其是在循环语句里反复调用,因为里面的命令不是原子性的操作,可能有很多想不到的情况发生。

要实现某些方面的功能,最好的方式就是查看源代码(Linux开源就是有这个好处啊,为什么不呢),比如
system("mount ...");
system("cp ....");
我们可以直接在utils包里直接找到mount cp 等命令实现的源代码,进而可以发现他们调用了哪些更底层的系统函数。

#50