2010-09-12 27 views
8

Tôi đang viết một shell đơn giản như một khóa học hệ điều hành, tôi cần tìm trong PATH để tìm người dùng chương trình đã gõ, khi tôi tìm được đúng thư mục, tôi malloc một phần bộ nhớ vừa đủ để giữ tên thư mục cộng với tên chương trình, và tôi chuyển nó làm đối số đầu tiên cho execv().Điều gì xảy ra với bộ nhớ được cấp phát động khi gọi hàm execv()?

Tôi có thể đã phân bổ tĩnh 100 ký tự hoặc hơn, nhưng có giới hạn khiến tôi cảm thấy không thoải mái. Vì vậy, khi execv() thực hiện, là đống dọn dẹp hoặc là mảnh bộ nhớ bị mất?

Nó có thể không có nhiều bộ nhớ nhưng tôi chỉ tò mò.

+1

Nếu bạn đã cấp phát một bộ đệm tĩnh để giữ đường dẫn, nó phải có độ dài tối thiểu mà đường dẫn tuyệt đối của Linux có thể là. Tìm kiếm trên google cho biết đây là '4096' (từ'/usr/src/linux-2.4.20-8/include/linux/limits.h', '#define PATH_MAX 4096/* # ký tự trong tên đường dẫn bao gồm nul */'). Vì vậy, bạn nên bao gồm 'limits.h' và làm cho bộ đệm của bạn' PATH_MAX' ký tự. – Praetorian

Trả lời

8

Khi bạn exec(), toàn bộ quá trình là (a) đã kết thúc, vì vậy tất cả các tài nguyên bao gồm bộ nhớ động và một số fd như dưới đây, được hệ điều hành khai hoang và (b) thay thế: mã, dữ liệu, chủ đề, .. .

Re file descriptor, từ "man execve":

mô tả tập tin mở trong hình ảnh quá trình gọi điện thoại vẫn mở trong hình ảnh quy trình mới, ngoại trừ đối với những người mà gần-on-exec cờ được thiết lập (xem đóng (2) và fcntl (2)). Các mô tả vẫn mở không bị ảnh hưởng bởi execve().

+3

Có lẽ nó hiển nhiên nhưng điều đó chỉ đúng đối với một người thực hiện thành công. Nếu không thành công, quy trình gốc sẽ tiếp tục với bộ nhớ được cấp phát động vẫn được cấp phát. – mark4o

+1

Nói cách khác, cuộc gọi 'exec()' phân bổ các đối số của nó ở đâu đó trong bộ nhớ ngoài không gian tiến trình ban đầu, để khi nó thay thế hình ảnh thực thi bằng chương trình exec'd, các đối số đó nằm trên ngăn gọi ban đầu mới cho 'main()'. –

+3

@DavidRTribble Các đối số 'exec()' được sao chép vào không gian hạt nhân nhờ nó là một lời gọi hệ thống. Không có gì đặc biệt về 'exec()' trong khía cạnh này. – EJP

Các vấn đề liên quan