最近我有一個作業,我必須制作一個程式,該程式從命令列獲取兩個不同的命令,用“ ”分隔,例如:
ps -lu myUsername ls -la
該程式的目標是通過使用fork()和,同時運行任意兩個訂單,每個訂單具有任意數量的引數exec()。這是我對這個問題的解決方案:
注意:最初的問題是要在具有 Solaris 5.10 和 c89 或 c99 標準 (gcc 3.4.3) 的機器上運行
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <strings.h>
int main (int argc, char* argv[]) {
char delimiter = ' ';
char* auxp; //auxiliar pointer
int i = 1;
int position;
while(i < argc){
if (strcmp(" ", argv[i]) == 0) {
argv[i] = NULL;
position = i;
}
i ;
}
if (fork() == 0) {
execvp(argv[1], &argv[1]);
exit(1);
}
if (fork() == 0) {
execvp(argv[position 1], &argv[position 1]);
exit(1);
}
wait(NULL);
wait(NULL);
exit(0);
}
這對于分配來說已經足夠了,但我想讓它使用N 個引數而不是只有 2 個引數。我無法找到一種系統的方法來找到所有地址。任何幫助表示贊賞,感謝建議。
uj5u.com熱心網友回復:
只需將分叉移動到回圈中:
int main (int argc, char* argv[])
{
char** start = argv;
unsigned int n = 0;
for(; *argv; argv) // profiting from argv being null terminated, too...
{
if (strcmp(" ", *argv) == 0)
{
*argv = NULL;
if (fork() == 0)
{
execvp(*start, start);
exit(1);
}
start = argv 1;
n; // but need to count how many times we actually forked!
}
}
while(n--)
{
wait(NULL);
}
exit(0);
}
好的,我也稍微修改了迭代——指標更好(個人意見......)。
注意:這是未經測驗的代碼,如果您發現錯誤,請自行修復...
uj5u.com熱心網友回復:
對于N個命令的一般情況,需要跟蹤每個命令的開始和結束位置,并在發現命令結束時fork一個新的子命令。這可能位于 分隔符引數處,或位于原始引數串列的末尾。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[]) {
/*
* Note: argc could be in range 0 to INT_MAX.
* Using unsigned int values to avoid arithmetic overflow.
*/
unsigned int start = 1;
unsigned int end = 1;
unsigned int child_count = 0;
/* Note: argv[argc] is a terminating null pointer. */
while(end <= (unsigned int)argc){
if(end == (unsigned int)argc || strcmp(" ", argv[end]) == 0){
/* Reached the terminating null pointer or a command separator. */
argv[end] = NULL;
if(start != end){
/*
* Command is not empty.
* Fork a child process to execute the command.
*/
pid_t child = fork();
if(child > 0){
/* Parent forked child successfully. */
child_count ;
}else if(child == 0){
/* This is the child process. Execute command. */
execvp(argv[start], &argv[start]);
exit(1);
}
}
/* Next command starts after this one. */
start = end 1;
}
/* Looking for terminating null pointer or command separator. */
end ;
}
/* Wait for the child processes to terminate. */
while(child_count){
wait(NULL);
child_count--;
}
exit(0);
}
注意:該argv[end] = NULL;行可以移動到if(child == 0){ }塊中(但在呼叫 之前execvp)以保持父級的原始引數串列完好無損。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364021.html
下一篇:在檔案中查找特定位元組
