Cuộc gọi fork()
là đủ. Nó cũng linh hoạt hơn, nó cho phép bạn thực hiện những điều như điều chỉnh chuyển hướng I/O trong quá trình con, thay vì làm phức tạp cuộc gọi hệ thống để tạo quy trình. Với các chương trình SUID hoặc SGID, nó cho phép đứa trẻ mất đặc quyền cao của nó trước khi thực hiện quá trình khác.
Nếu bạn muốn có một cách phức tạp để tạo quy trình, hãy tra cứu hàm posix_spawn()
.
#include <spawn.h>
int posix_spawn(pid_t *restrict pid, const char *restrict path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
Sự khác biệt là posix_spawnp()
hiện một tìm kiếm trên PATH cho thực thi.
Có toàn bộ các chức năng khác để xử lý các loại posix_spawn_file_actions_t
và posix_spawnattr_t
(theo liên kết 'Xem thêm' ở cuối trang người được tham chiếu).
Điều này khá giống với CreateProcess()
trên Windows. Đối với hầu hết các phần, mặc dù, bằng cách sử dụng fork()
theo sau là exec()
là đơn giản hơn.
Tôi không hiểu ý bạn là gì. Mã quy trình con sẽ được viết bởi tôi, vậy sự khác nhau giữa việc viết if (fork() == 0)
là gì và đặt mã này vào đầu số main()
của trẻ?
Rất thường xuyên, mã bạn thực thi không phải do bạn viết, vì vậy bạn không thể sửa đổi những gì xảy ra trong quá trình bắt đầu của trẻ. Hãy nghĩ về một cái vỏ; nếu các chương trình duy nhất bạn chạy từ trình bao là những chương trình bạn đã viết, cuộc sống sẽ rất nghèo nàn.
Khá thường xuyên, mã bạn thực thi sẽ được gọi từ nhiều nơi khác nhau. Đặc biệt, hãy nghĩ về một trình bao và một chương trình đôi khi sẽ được thực hiện trong một đường ống và đôi khi được thực hiện mà không cần đường ống. Chương trình được gọi không thể cho biết các chuyển hướng I/O và các bản sửa lỗi nào cần thực hiện; chương trình gọi điện thoại biết.
Nếu chương trình gọi đang chạy với đặc quyền nâng cao (đặc quyền SUID hoặc SGID), bình thường là bạn muốn tắt các chương trình đó trước khi chạy một chương trình khác. Dựa vào chương trình khác để biết phải làm gì là ... ngu ngốc.
tôi không hiểu ý bạn là gì. mã quá trình con sẽ được viết bởi tôi vì vậy sự khác biệt giữa viết là gì (fork() == 0) và đặt mã này vào đầu phần chính của con()? –
hmm, do đó, bạn nói rằng nó chỉ là dễ dàng hơn với fork() - exec() cặp vợ chồng để làm những việc như vậy (i/o chuyển hướng, lấy lại đặc quyền, vv ..) tôi đã làm cho nó đúng? –
Có: so với các mâu thuẫn cần thiết cho 'posix_spawn()', nó đơn giản hơn nhiều khi sử dụng 'fork()' và sau đó yêu cầu con thực hiện các hành động cần thiết, trước khi sử dụng 'exec()'. Đọc lý do cho 'posix_spawn()'; nó khá ngộ nghĩnh (hoặc, ít nhất, đó là với tôi). Danh sách những thứ bạn có thể làm với 'posix_spawn()' là ấn tượng, nhưng nó cũng phức tạp hơn những gì 'fork()' cung cấp. –