2009-06-16 6 views
14

Tôi muốn khởi chạy tiến trình từ bên trong chương trình c của mình, nhưng tôi không muốn đợi chương trình đó kết thúc. Tôi có thể khởi chạy quá trình đó bằng cách sử dụng hệ thống() nhưng luôn luôn chờ đợi. Có ai biết về một phiên bản 'không chặn' sẽ trở lại ngay sau khi quá trình đã được bắt đầu?Phiên bản không bị chặn của hệ thống()

[Chỉnh sửa - Yêu cầu bổ sung] Khi quá trình ban đầu đã hoàn tất việc thực hiện, quá trình con cần tiếp tục chạy.

+0

Tôi nghĩ rằng 'system()' không bị chặn. – puk

Trả lời

14

Tại sao không sử dụng fork()exec() và chỉ cần không gọi waitpid()?

Ví dụ, bạn có thể làm như sau:

// ... your app code goes here ... 
pid = fork(); 
if(pid < 0) 
    // error out here! 
if(!pid && execvp(/* process name, args, etc. */) 
    // error in the child proc here! 
// ...parent execution continues here... 
+0

hmmm, dường như không hoạt động đối với tôi. Tôi nghĩ rằng vấn đề có thể là chương trình của tôi (nó là một ứng dụng CGI) tồn tại ngay sau khi nó được gọi là execvp - điều này sẽ giết chết quá trình con? Ngoài ra ... mã sau khi execvp xuất hiện đang được chạy hai lần. –

+0

Simon, bạn có thể đặt mẫu mã ở đây không? Điều gì có thể xảy ra là phụ huynh đã thoát ngay sau khi quá trình con đã được chia nhỏ. Bạn đã sử dụng waitpid (chld_pid) theo đề xuất của Mr./Ms chưa. Bộ nhớ trống? – SashaN

+0

@Simon: nếu mã sau execvp() xuất hiện để chạy hai lần, rất có thể nó có nghĩa là execvp() không thành công và việc xử lý lỗi cho nó không ngăn mọi thứ trở nên tồi tệ (trả về hoặc thoát). Trong một chương trình CGI, bạn có biết PATH được đặt là gì không? Nó có lẽ là spartan hơn bạn mong đợi. –

15

Một lựa chọn tham gia cuộc gọi hệ thống của bạn, làm điều này:

system("ls -l &"); 

các & ở phần cuối của lệnh đối số dòng Forks sự tác vụ bạn đã khởi chạy.

6

Cách thông thường để làm điều đó và trên thực tế bạn không nên sử dụng hệ thống() nữa là popen.
này cũng cho phép bạn đọc hoặc viết từ stdin quá trình sinh ra của/ra

chỉnh sửa: Xem popen2() nếu bạn cần phải đọc và viết - Thansk quinmars

+0

Tôi nghĩ rằng điều này nên được đọc _or_ viết – quinmars

0

Cuối cùng, mã này xuất hiện để làm việc . Chút của một mis-mash của các câu trả lời ở trên:

pid = fork(); 

if (!pid) 
{ 
    system("command here &"); 
} 

exit(0); 

Không khá chắc chắn tại sao nó hoạt động, nhưng nó làm những gì tôi sau đó, nhờ mọi người giúp đỡ của bạn

+0

Nó hoạt động, nhưng nó không thực sự những gì bạn muốn làm. system() thực sự forks một thể hiện của một shell, và vượt qua shell lệnh mà bạn muốn thực hiện. Vì vậy, về cơ bản, những gì bạn đang làm là như sau: fork(), fork(), execl ("/ bin", "sh", "command_to_run &"). Chắc chắn, nó hoạt động, nhưng nó làm việc nhiều hơn nó nên. – FreeMemory

+0

lý do thêm ngã ba()? Bạn không thể chỉ sử dụng hệ thống ("... &"); cuộc gọi? –

1

Bạn có thể sử dụng posix_spawnp() chức năng. Nó tương tự như system() so với kết hợp fork và exec *, nhưng không bị chặn.